2012-11-26 2 views
1

나는 나의 정의에있는 투영에 문제가있다. 실제로 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 3P 4을 교환하려고하면

. ite[0,2,3]3이고 ite[1,2,3]2을 반환해야합니다. 대신 그 반대가 일어나고 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

+2

짧은 식별자 _can_ 코드를 읽기 쉽도록 만들지 만 ... – leftaroundabout

+0

@leftaroundabout ID는 필자의 대학에서 사용 된 PR 교정서를 따르는 규약을 따릅니다. – evanmcdonnal

답변

5

어떻게이 클래스를 좋아하니? 나는 너와 내가 비슷한 숙제를 가지고 있음을 알아 챘다. 매우 비슷했다.

음 먼저 IF-Then-Else 모델을 에뮬레이트하는 원시 재귀 함수를 만들고 싶습니다. 따라서

eval ite [0,1,2] => 1 

eval ite [1,2,3] => 3 

당신이 제공하는 것과

, 당신은 아직 첫 번째 입력에 따라 반대의 경우에 동일한 자질을 가진 함수를 받고있는 것으로 보인다.

ife = PR (P 1) (C (P 2) [P 3, P 4])

지금 무슨 일이 함수는 말하고있다? ITE 구현은 기본 재귀 구문을 사용합니다. 시작에서입니다.이 경우 조건에 따라 두 개의 다른 표현식으로 실행을 분할 할 수 있기 때문입니다. Boolean algegra에 사용 된 조건과 동일합니다. 0이면 거짓, 그렇지 않으면 숫자가 아무 것도 계산되지 않으면 (0 <) 사실입니다. PR 구조는 "스택"의 머리가 0 인 경우 첫 번째 인수를 평가하여이를 수행합니다. 그렇지 않으면 두 번째 인수를 줄을 따라 어딘가에 종료시킬 것입니다. 첫 번째 인수를 실행). 그러나 모든 의도와 목적을 위해 두 번째 표현식이 실행될 것이라고 말할 수 있습니다 (0 <).

피어! 그렇다면 구현을 어떻게 수정합니까? 쉬운 : 당신은 단순히 뒤쪽을했다으로

ife = PR (P 2) (C (P 1) [P 3, P 4])

우리는 당신이 전망을 전환 할 수 있습니다. 스택의 헤드가 Z이면 두 번째 표현식을 투영하고 그렇지 않으면 첫 번째 표현식을 투영합니다. 또는 더 나은 아직이 :

ite = PR (P 2) (P 1) 

나는 생각한다, 나는 어느 숙제를하지 그리고 난 틀렸다면 나는 어떤 여분의 통찰력을 주셔서 감사합니다 높은 것이다.

+0

PSU에 가십니까? 나는 그것이 옳을 거라 생각하지만 일을 마칠 때까지 나는 그것을 확인할 수 없다. 나는'P3'과'P4'에 너무 집중했다. 이 후에 저는 Factorial과 Integer Equality를해야합니다. – evanmcdonnal

+0

Heh, CS 311. 지난 봄에 당신도 CS251에 있었다는 느낌이 들었습니다. 여기에 정말 멋진 힌트가 있습니다 : diff [2,1] == 1이므로 absDiff = C + [ 빼기 [P1, P2]), (C 빼기 [P2, P1])] 이 순서는 상관없이 차이를 반환합니다. 숙제에서 묻지는 않았지만 평등 기능을 구축하는 데 매우 유용 할 수 있습니다. – Eric

+0

몇 시간 전에 과제를 마쳤습니다. 나는 eq = C [(C modus [P 1, P 2]), (C modus [P 2, P 1])]'와 같은 평등을했습니다. – evanmcdonnal

0

의견을 남기려면 충분하지 않으므로 여기에 남겨 두겠습니다.

나는 첫 번째 값이 더 무작위 값이없는이 방법 Y. 0 ELSE가 아닌 경우 대신

ife = PR (P 1) (C (P 2) [P 3, P 4]) 
           ^

이 방법 X가 선택 될 것입니다 원래 버전의

ife = PR (P 1) (C (P 2) [P 3, P 3]) 
           ^

해야한다고 생각 반환되었습니다. 또한 그것은 글쓰기 및/또는 ... easer를 만듭니다.

관련 문제