어떻게 하스켈에서 이와 유사한 함수를 결합 할 수 있습니까?하스켈에서의 결합 함수
getGroup [] acc = reverse acc
getGroup ((Letter x):letfs) acc = getGroup letfs ((Letter x):acc)
getGroup ((Group x):letfs) acc = getGroup letfs ((Group (makeList x)):acc)
getGroup ((Star x):letfs) acc = getGroup letfs ((Star (makeList x)):acc)
getGroup ((Plus x):letfs) acc = getGroup letfs ((Plus (makeList x)):acc)
getGroup ((Ques x):letfs) acc = getGroup letfs ((Ques (makeList x)):acc)
Letter, Group, Star, Plus 및 Ques는 모두 데이터 형식 정의의 일부입니다.
data MyData a
= Operand a
| Letter a
| Star [RegEx a]
| Plus [RegEx a]
| Ques [RegEx a]
| Pipe [RegEx a] [RegEx a]
| Group [RegEx a]
deriving Show
유사점 때문에 이러한 기능을 작성하는 더 좋은 방법이 있는지 궁금합니다. 대부분 Group, Star, Plus 및 Ques의 기능을 동일하게 결합하기를 원합니다. 그러나 모두를 결합하는 방법이 있으면 더 좋을 것입니다.
죄송합니다 ... 나는 하스켈을 처음 사용합니다. 그래서 내 함수 문자 (예를 들어) 실제로 될 것이다 :'이동 ((문자 x) : 왼쪽) acc = getGroup 왼쪽 ((문자 x) : acc)'? – tasegula
아니요, 축전지를 제거하십시오. 게으른 평가를 처리 할 때 테일 재귀는 나쁩니다. 공간 누수가 발생합니다.'map'과 같은 higher order 함수를 사용하는 것이 더 낫지 만, 명시 적 재귀를 사용하려면이 getGroup ((Letter x) : lefts) = Letter x : getGroup lefts'와 같아야합니다. –
이 오류가 발생했습니다 :'get '에 대한 구문 분석 오류가 두 번째 시도에서 발생합니다 :'getGroup = map go 여기서 \t go ((Letter x) : 왼쪽) = 문자 x : getGroup lefts go ((별표 x) : 왼쪽) = (별표 메이크업 $ x) : getGroup lefts go ((Plus x) : 왼쪽) = (더하기 makeList $ x) : getGroup lefts go ((Ques x) 왼쪽) = (QList. makeList $ x) : getGroup lefts \t \t go ((그룹. makeList $ x) : getGroup lefts') (그래서 첫 번째는 괜찮습니다.) – tasegula