나는 나의 정의에있는 투영에 문제가있다. 실제로 If-Else-Then으로 실행 중입니다. 원시적 인 재귀 만약 그렇다면 실제로 Else가 실행된다면 Then
import Prelude hiding (pred,and,or,not)
data PR = Z
| S
| P Int
| C PR [PR]
| PR PR PR
deriving Show
eval :: PR -> [Integer] - Integer
eval Z _ = 0
eval S [x] = x+1
eval (P n) xs = nth n xs
eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
eval (PR g h) (0:xs) = eval g xs
eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)
nth _ [] = error "nth nil"
nth 0 _ = error "nth index"
nth 1 (x:_) = x
nth (n) (_:xs) = nth (n-1) xs
one = C S [Z]
plus = PR (P 1) (C S [P 2])
ife = PR (P 1) (C (P 2) [P 3, P 4])
나는 그냥 완전히 분해합니다 ('다음'값마다 반환) P 3
및 P 4
을 교환하려고하면
ite[0,2,3]
은
3
이고
ite[1,2,3]
은
2
을 반환해야합니다. 대신 그 반대가 일어나고 있습니다. 이 문제를 어떻게 해결할 수 있습니까?
짧은 식별자 _can_ 코드를 읽기 쉽도록 만들지 만 ... – leftaroundabout
@leftaroundabout ID는 필자의 대학에서 사용 된 PR 교정서를 따르는 규약을 따릅니다. – evanmcdonnal