Andrej 또는 Neel의 설명에 무엇이든 추가하기는 어렵지만 한 번하겠습니다. 나는 설명이 더 기본적이고 내 질문에 대한 더 직접적인 대답을 제공하기 때문에 기본 의미를 발견하려고 시도하는 대신 구문 관점을 다루려고 노력할 것입니다.
저는 Haskell의보다 복잡한 시스템이 아닌 단순 형식의 -calculus 에서 작업 할 것 입니다. 특히 유형 변수가 있으면 어느 정도 혼란 스러울 수 있다고 생각합니다.λ
중요한 참조는 다음과 같습니다.
Mendler, N. (1991). 2 차 람다 미적분에서의 유도 유형 및 유형 제약. 온라인에서 참조를 찾지 못했습니다. 그러나이 진술과 증거는 Nax의 박사 학위 논문 ( 강제 권장 사항!) 에서 찾을 수 있습니다 .
멘 들러는 양성은 비재 귀적 사례 정의 (그리고 구조적으로 감소하는 재귀 적 사례)가 존재하는 경우 종결을 위해 필요 하고 충분한 조건 이라고 설명했다 . 그는 방정식 공식을 사용하여 설명합니다 . 간단한 예를 이는 형식을 단순화 한 것 입니다.Bad
Bad=Bad→A
여기서 는 모든 유형입니다. 우리는 다음A
λx:Bad.x x:Bad→A
그래서
(λx:Bad.x x) (λx:Bad.x x):A
이것에 대해 수행 될 수 있다는 멘 도시 어떤 유형
여기서, 적어도 하나 개의 음의 발생이있는 타입 (물론 양극 발생이있을 수있다) . 그는 주어진 (논문 39-40 페이지 대해 끝나지 않는 명확한 용어를 제공합니다 .
Bad=F(Bad)
F(X)XF(X)
물론 방정식으로 정의 된 유형이 아니라 생성자 로 작업하고 있습니다.
data Bad = Pack (Bad -> A)
엄격한 평등보다는 그러나 당신은 정의 할 수 있습니다
unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f
이 결과를 계속 유지하기에 충분합니다.
(\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))
이 용어는 여전히 유형 의 유형 입니다.A
두 번째 예에서는 라인을 따라 무언가가 있기 때문에 상황이 조금 더 까다로워집니다.
Bad=Bad′→A
여기서 되어 관련 ,하지만 하지 에, 동일 가 동일하다 귀하의 경우 ( 와 ). 나는 둘 사이에 간단한 동 형사상을 만들 수 없다는 것을 인정할 것이다. 교체해도 동일한 문제가 발생합니다B a d B a d a B a d ( N o t a)Bad′BadBad aBad (Not a)
type Not a = a -> False
와
data Not a = Not a
Haskell이 이러한 유형 정의를 허용하면 쉽게 해결할 수 있습니다.
type Acc = Not Acc
이 경우 이전과 정확히 동일한 방식으로 루핑 결합기를 만들 수 있습니다. 나는 당신이 비슷한 (그러나 더 복잡한) 구성을 사용할 수 있다고 생각합니다.
data Acc = D (Not Acc)
여기서 문제는 동 형사상을 만드는 것입니다
Bad Acc <-> Bad (Not Acc)
혼합 분산을 다루어야합니다.