다음은 GADT 's의 Simon Peyton-Jones가 작성한 this lecture입니다.Haskell에서의 모험 : GADT 's : 왜 다음과 같은 형 검사를합니까?
data T a where
T0 :: Bool -> T Bool
T1 :: T a
를 그리고 요구되는 문제는 다음과 같은 기능의 유형입니다 무엇 :이 다음 데이터 형 선언 나에게
f x y = case x of
T0 _ -> True
T1 -> y
는, 그것만이 가능한 유형은 보인다 이다 : 그러나
f :: T a -> Bool -> Bool
, 다음과 같은 유형 :
f :: T a -> a -> a
도 유효합니다!
f (T1) "hello"
내 질문은 왜 유효 f
의 두 번째 유형의 서명입니다 다음과 같이 그리고 실제로 당신은 f
를 사용할 수 있을까?
GADT는 typechecker가 패턴 일치 할 때 실제로 정보를 얻을 수 있다는 점에서 특별합니다. 'T0'에 주어진 타입으로 인해 패턴 매치가'T0' 생성자에서 성공할 때, GHC는'a ~ Bool'을 확신 할 수 있습니다. 그래서 여러분이 작성한 코드가 typechecks를 검사합니다. –