제품 유형에 따른 유형 유추


15

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

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

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

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

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

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

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

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

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

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

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

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

dup::Ab.AbAbbswap::Abc.AbcAcbpop::Ab.AbAquote::Ab.AbA(C.CCb)apply::AB.A(AB)B

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

compose::ABCD.A(BC)(CD)A(BD)

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

compose::ABCDE.A(BC)(DE)A

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

compose::ABCDE.A(BC)(DE)A((DC)B((CD)E))

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

Γe1:AB.ABΓe2:CD.CDΓe1e2:((CB)A((BC)D))[Comp]

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

A.()A=()A.A()=AABCD.ABCD=BD 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:AbA 이므로 유효해야하며 유형A b 이어야하지만 표현식이 허용되지 않습니다.AAb . 해결책은 물론 한정자를 올바른 장소에 두는 것이지만, 주로순환 정의없이유형을 실제로 작성하는 방법이 궁금합니다. Ab.AbbAcompose
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.