제품 유형에 따른 유형 유추


15

연결 언어에 대한 컴파일러를 개발 중이며 형식 유추 지원을 추가하고 싶습니다. Hindley–Milner를 이해하고 있지만 유형 이론을 배우고 있으므로이를 적용하는 방법을 잘 모르겠습니다. 다음과 같은 시스템은 소리가 나지 않으며 추론 할 수 없습니까?

용어는 리터럴, 용어 구성, 용어 인용 또는 기본형입니다.

e::=x|ee|[e]|…

모든 용어는 기능을 나타냅니다. 두 기능 e1 과 e2 경우 e1e2=e2∘e1 즉, 병치 배치는 역 조성을 나타낸다. 리터럴은 나일 함수를 나타냅니다.

구성 이외의 용어에는 기본 유형 규칙이 있습니다.

x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ

연결 언어에는 부족하기 때문에 적용 규칙이 없습니다.

유형은 리터럴, 유형 변수 또는 스택에서 스택까지의 함수이며 스택은 오른쪽 중첩 튜플로 정의됩니다. 모든 함수는 "스택의 나머지"와 관련하여 암시 적으로 다형성입니다.

τ::=ι|α|ρ→ρρ::=()|τ×ρσ::=τ|∀α.σ

이것이 의심되는 첫 번째 사실이지만, 무엇이 잘못되었는지 정확히 모르겠습니다.

가독성을 높이고 괄호를 줄이려면 다음과 같이 가정합니다 형식 체계에서 b = b × ( a ) . 또한 단일 값이 아닌 스택을 나타내는 변수에 대문자를 사용할 것입니다.ab=b×(a)

6 가지 기본 요소가 있습니다. 처음 다섯은 무해합니다. dup최고 가치를 가져 와서 두 개의 사본을 만듭니다. swap상위 2 개 값의 순서를 변경합니다. pop최고 값을 버립니다. quote값을 가져 와서이를 반환하는 견적 (함수)을 생성합니다. apply스택에 견적을 적용합니다.

dup::∀Ab.Ab→Abbswap::∀Abc.Abc→Acbpop::∀Ab.Ab→Aquote::∀Ab.Ab→A(∀C.C→Cb)apply::∀AB.A(A→B)→B

마지막 조합 compose은 두 인용문을 가져 와서 연결 유형, 즉 . 정적으로 유형이 지정된 연결 언어Cat에서 유형은 매우 간단합니다.[e1][e2]compose=[e1e2]compose

compose::∀ABCD.A(B→C)(C→D)→A(B→D)

그러나이 유형은 너무 제한적입니다. 첫 번째 함수 의 생성이 두 번째의 소비 와 정확히 일치해야 합니다. 실제로는 고유 한 유형을 가정 한 다음 통합해야합니다. 그러나 어떻게 그 유형을 쓸 것입니까?

compose::∀ABCDE.A(B→C)(D→E)→A…

let ∖ 가 두 유형 의 차이 를 나타내 하면 유형을 올바르게 쓸 수 있다고 생각compose 합니다.

compose::∀ABCDE.A(B→C)(D→E)→A((D∖C)B→((C∖D)E))

이것은 여전히 ​​비교적 간단합니다. compose함수 와 하나의 f 2 : D → E를 취합니다 . 결과는 f 1에 의해 생성되지 않은 f 2 소비 위에서 B를 소비하고, f 2에 의해 소비되지 않는 f 1 의 생산 위에 D를 생성f1:B→Cf2:D→EBf2f1Df1f2 . 이것은 일반적인 구성에 대한 규칙을 제공합니다.

Γ⊢e1:∀AB.A→BΓ⊢e2:∀CD.C→DΓ⊢e1e2:((C∖B)A→((B∖C)D))[Comp]

그러나 나는이 가상의 실제로 어떤 것에 해당 하는지 모른다 . 그리고 내가 잘못 돌았다고 생각할 정도로 오랫동안 서클에서 그것을 쫓아왔다. 튜플의 간단한 차이 일 수 있습니까?∖

∀A.()∖A=()∀A.A∖()=A∀ABCD.AB∖CD=B∖D iff A=Cotherwise=undefined

내가 보지 못하는 것에 대해 끔찍하게 깨진 것이 있습니까? 아니면 올바른 궤도에 있습니까? (아마도이 ​​물건 중 일부를 잘못 정량화했으며 해당 영역의 수정 사항도 감사하겠습니다.)


문법에서 변수를 어떻게 사용합니까? 이 질문은 필요한 "서브 타이핑"을 처리하는 데 도움이됩니다.
— jmad

1
@ jmad : 질문을 이해하지 못했습니다. 형식 변수는 형식 체계를 공식적으로 정의하기 위해 존재하며 언어 자체에는 전혀 변수가 없으며 정의 만 있으며 [상호 적으로] 재귀적일 수 있습니다.
— Jon Purdy

그럴 수 있지. 왜 (예를 들어) 규칙 compose이 너무 제한적 이라고 말할 수 있습니까 ? 나는 이것이 이것처럼 괜찮다는 인상을 받았습니다. (예를 들어 제한 는 λ- 미적분과 같은 적용과 같은 통일에 의해 처리 될 수있다)C=D
— jmad

@jmad : 물론입니다. 로 twice정의 된 것을 고려하십시오 dup compose apply. 견적을 받아서 두 번 적용하십시오. [1 +] twice괜찮습니다 : 유형의 두 가지 기능을 구성하고 있습니다. 그러나 그렇지 않은 경우 : ∀ A bι→ι[pop] twice , 문제는 A ≠∀Ab.f1,f2:Ab→A 이므로 유효해야하며 유형 ∀ A b 이어야하지만 표현식이 허용되지 않습니다.A≠Ab . 해결책은 물론 한정자를 올바른 장소에 두는 것이지만, 주로순환 정의없이유형을 실제로 작성하는 방법이 궁금합니다. ∀Ab.Abb→Acompose
— Jon Purdy 2016 년

답변:


9

다음의 랭크 -2 타입 는 충분히 일반적인 것 같습니다. 그것은 문제에서 제안 된 유형보다 훨씬 다형성입니다. 여기서는 다중 인수 함수를 캡처하는 연속 스택 덩어리에 대해 변수를 수량화합니다.

compose:∀ABCδ.δ (∀α.α A→αB) (∀β.β B→βC)→δ (∀γ.γ A→γC)

그리스어 문자는 명확성을 위해 나머지 변수에 사용됩니다.

스택에서 첫 번째 요소의 출력 스택이 두 번째 요소의 입력 스택과 같아야한다는 제약 조건을 나타냅니다. 변수 B를 적절하게 인스턴스화B두 개의 실제 인수에 대해 를 것은 질문에서 제안 할 때 새 작업을 정의하는 대신 제약 조건이 올바르게 작동하는 방법입니다.

유형 검사 순위 2 유형은 일반적으로 결정 불가능하지만 실제로는 좋은 결과를 제공하는 몇 가지 작업이 수행되었지만 (Haskell의 경우)

  • Simon L. Peyton Jones, Dimitrios Vytiniotis, Stephanie Weirich, Mark Shields : 임의 순위 유형에 대한 실제 유형 유추. J. Funct. 프로그램. 17 (1) : 1-82 (2007)

구성의 유형 규칙은 다음과 같습니다.

Γ⊢e1:∀α.α A→α BΓ⊢e1:∀α.α B→α CΓ⊢e1 e2:∀α.α A→α C

유형 시스템이 일반적으로 작동하게하려면 다음 전문화 규칙이 필요합니다.

Γ⊢e:∀α.α A→α BΓ⊢e:∀α.C A→α C B

감사합니다. 매우 도움이되었습니다. 이 유형은 단일 인수의 기능에 적합하지만 여러 인수를 지원하지 않습니다. 예를 들어, dup +형식을 가져야한다 때문에 형이 ι를ι→ι+ . 그러나 주석이없는 경우 유형 유추는 절대적인 요구 사항이므로 분명히 드로잉 보드로 돌아 가야합니다. 그래도 다른 접근 방식을 모색 할 아이디어가 있으며 그것이 잘되면 블로그에 올릴 것입니다. ιι→ι
— Jon Purdy 2016 년

1
스택 유형은 스택 조각에 대해 수량화되므로 두 개의 인수 함수를 처리하는 데 아무런 문제가 없습니다. dup +위에서 정의한대로 작성을 사용하지 않으므로 이것이 어떻게 적용되는지 잘 모르겠습니다 .
— Dave Clarke

어, 맞아 [dup] [+] compose. 그러나 나는 α를 읽습니다.αBB×αB=ι×ι(ι×ι)×αι×(ι×α)

스택을 잘못된 방향으로 만들고있을 수 있습니다. 스택을 구축하는 쌍이 프로그래밍 언어로 나타나지 않는 한 중첩 문제는 생각하지 않습니다. (내 답변을 업데이트 할 계획이지만 먼저 약간의 조사가 필요합니다.)
— Dave Clarke

예, 중첩은 구현 세부 사항입니다.
— Jon Purdy 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.