연결 언어에 대한 컴파일러를 개발 중이며 형식 유추 지원을 추가하고 싶습니다. Hindley–Milner를 이해하고 있지만 유형 이론을 배우고 있으므로이를 적용하는 방법을 잘 모르겠습니다. 다음과 같은 시스템은 소리가 나지 않으며 추론 할 수 없습니까?
용어는 리터럴, 용어 구성, 용어 인용 또는 기본형입니다.
모든 용어는 기능을 나타냅니다. 두 기능 과 경우 즉, 병치 배치는 역 조성을 나타낸다. 리터럴은 나일 함수를 나타냅니다.
구성 이외의 용어에는 기본 유형 규칙이 있습니다.
연결 언어에는 부족하기 때문에 적용 규칙이 없습니다.
유형은 리터럴, 유형 변수 또는 스택에서 스택까지의 함수이며 스택은 오른쪽 중첩 튜플로 정의됩니다. 모든 함수는 "스택의 나머지"와 관련하여 암시 적으로 다형성입니다.
이것이 의심되는 첫 번째 사실이지만, 무엇이 잘못되었는지 정확히 모르겠습니다.
가독성을 높이고 괄호를 줄이려면 다음과 같이 가정합니다 형식 체계에서 b = b × ( a ) . 또한 단일 값이 아닌 스택을 나타내는 변수에 대문자를 사용할 것입니다.
6 가지 기본 요소가 있습니다. 처음 다섯은 무해합니다. dup
최고 가치를 가져 와서 두 개의 사본을 만듭니다. swap
상위 2 개 값의 순서를 변경합니다. pop
최고 값을 버립니다. quote
값을 가져 와서이를 반환하는 견적 (함수)을 생성합니다. apply
스택에 견적을 적용합니다.
마지막 조합 compose
은 두 인용문을 가져 와서 연결 유형, 즉 . 정적으로 유형이 지정된 연결 언어Cat에서 유형은 매우 간단합니다.compose
그러나이 유형은 너무 제한적입니다. 첫 번째 함수 의 생성이 두 번째의 소비 와 정확히 일치해야 합니다. 실제로는 고유 한 유형을 가정 한 다음 통합해야합니다. 그러나 어떻게 그 유형을 쓸 것입니까?
let 가 두 유형 의 차이 를 나타내 하면 유형을 올바르게 쓸 수 있다고 생각compose
합니다.
이것은 여전히 비교적 간단합니다. compose
함수 와 하나의 f 2 : D → E를 취합니다 . 결과는 f 1에 의해 생성되지 않은 f 2 소비 위에서 B를 소비하고, f 2에 의해 소비되지 않는 f 1 의 생산 위에 D를 생성 . 이것은 일반적인 구성에 대한 규칙을 제공합니다.
그러나 나는이 가상의 실제로 어떤 것에 해당 하는지 모른다 . 그리고 내가 잘못 돌았다고 생각할 정도로 오랫동안 서클에서 그것을 쫓아왔다. 튜플의 간단한 차이 일 수 있습니까?
내가 보지 못하는 것에 대해 끔찍하게 깨진 것이 있습니까? 아니면 올바른 궤도에 있습니까? (아마도이 물건 중 일부를 잘못 정량화했으며 해당 영역의 수정 사항도 감사하겠습니다.)
compose
이 너무 제한적 이라고 말할 수 있습니까 ? 나는 이것이 이것처럼 괜찮다는 인상을 받았습니다. (예를 들어 제한 는 λ- 미적분과 같은 적용과 같은 통일에 의해 처리 될 수있다)
twice
정의 된 것을 고려하십시오 dup compose apply
. 견적을 받아서 두 번 적용하십시오. [1 +] twice
괜찮습니다 : 유형의 두 가지 기능을 구성하고 있습니다. 그러나 그렇지 않은 경우 : ∀ A b[pop] twice
, 문제는 A ≠ 이므로 유효해야하며 유형 ∀ A b 이어야하지만 표현식이 허용되지 않습니다. . 해결책은 물론 한정자를 올바른 장소에 두는 것이지만, 주로순환 정의없이유형을 실제로 작성하는 방법이 궁금합니다. compose