여기에 나와 있지 않은 관련없는 코드 조각에 사용할 GADT 확장 프로그램으로 컴파일 할 때 유형 오류로 인해 아래의 to_c
기능이 거부됩니다.Church 인코딩 변환 기능이 GADT로 컴파일되지 않습니다.
newtype Church = Church { unC :: forall a. (a -> a) -> a -> a }
to_c :: Int -> Church
to_c 0 = let f0 f c = c in Church f0
to_c n =
let fn f c = iterate f c !! n in Church fn
오류 메시지 :
Couldn't match type ‘a0’ with ‘a’ because type variable ‘a’ would escape its scope
This (rigid, skolem) type variable is bound by
a type expected by the context:
(a -> a) -> a -> a
Expected type: (a -> a) -> a -> a
Actual type: (a0 -> a0) -> a0 -> a0
In the first argument of ‘Church’, namely ‘fn’
내가 일을 또한 확인하고 입력합니다 직접 재귀 스타일 기능을 다시 작성할 수 있습니다; 그러나이 반복적 인 접근 방식이 결함이 있는지, 그리고 그것이 영리한 유형의 주석으로 복구 될 수 있는지 궁금했습니다.
특히 로컬 바인딩이 실제로 GADT를 포함하지 않기 때문에 'MonoLocalBinds'는이 경우 매우 제한적으로 보입니다. GHC에서 좀 더 편한 접근법을 사용할 수 있을지 궁금합니다. – chi
@chi, 아마도. 그러나 사용자가 추론이 언제 성공할 것인지 예측할 수 있어야합니다. 'MonoLocalBinds'는 이미 다형성을 허용하려고하기 때문에 이해하기가 약간 어렵습니다. 보다 영리한 소리를내는 것은 위험합니다. – dfeuer