2013-01-15 3 views
3

현재 대학을 위해 하스켈을 운영 중입니다.haskell의 부울 논리 및 유형

true::t -> t1 -> t 
true = (\x y -> x) 

false::t -> t1 -> t1 
false = (\x y -> y) 

-- Implication 
(==>) = (\x y -> x y true) 

작업은 함수 (==>)의 종류를 결정하는 것입니다 : 다음 하스켈 코드를 감안할 때. GHCi는 (==>) :: (t1 -> (t2 -> t3 -> t2) -> t) -> t1 -> t이라고 말합니다.

나는 평가 순서는 (유형이 동일하게 유지로) 다음과 같은 것을 볼 수 있습니다 : (x y)

(==>) = (\x y -> (x y) true) 

그래서 기능 true 표준시 인수.

왜 결과 유형 t가 첫 번째 인수의 결과에 바인딩되고 GHCi가 (==>) 유형을 결정하는지 설명 할 수 있습니까?

+1

이 도움이 될 수 있습니다 : 그것은 GHC는 추론 분명히 실제 알고리즘은 더 (물건의 종류를 확인하는 데 사용하는 기본 알고리즘을 설명 http://lucacardelli.name/Papers/BasicTypechecking.pdf 복잡한,하지만이 예제에서 작동) – Wes

+0

x는 가장 바깥 쪽 함수이기 때문에 x의 반환 형식은 ==>의 반환 형식입니다. – user3001

답변

4

첫째, 더 나은 개요를 제공하기 위해,

type True t f = t -> f -> t 
type False t f = t -> f -> f 

는 이제 \x y -> x y true :: r에, 우리가 가지고있는 의미 r의 결과를 부르 자, 따라서

x y :: True t f -> r 

그래서 x :: y -> True t f -> r

(==>) :: (y -> True t f -> r) -> y -> r 

, 확장형 True 다시

(==>) :: (y -> (t->f->t) -> r) -> y -> r 
+0

그리고 y는 x에 대한 논쟁이기 때문에 두 번째 매개 변수의 유형으로 다시 나타나기 때문에 두 번째 매개 변수의 유형으로 다시 나타 납니까? – user3001

+0

그건 '꽤 많이. – leftaroundabout