[편집 : Voilà 각각에 몇 마디]
HM 유형 추론을 확장하는 방법에는 여러 가지가 있습니다. 내 대답은 그 중 일부를 성공적으로 구현하려는 많은 시도에 근거합니다. 내가 우연히 만난 것은 파라 메트릭 다형성 입니다. 이 방향으로 HM을 확장하려는 유형 시스템은 시스템 F를 향하는 경향이 있으므로 유형 주석이 필요합니다. 내가 본 방향으로 주목할만한 두 가지 확장은 다음과 같습니다.
HMF는 모든 System-F 유형에 대해 유형 유추를 허용합니다. 즉, 유형의 "중간"에 범용 정량화를 수행 할 수 있으며 HM 다형성 유형과 같이 가장 높은 범위에 외관이 암시 적으로 배치되지 않습니다. 이 백서에는 유형 주석이 몇 개나 필요한지에 대한 명확한 규칙이 존재하지 않는다고 분명히 명시되어 있습니다. 또한 유형은 시스템 F의 유형이며 일반적으로 주체 유형이 없습니다.
MLF는 HM의 확장 일뿐만 아니라 유형에 대해 일종의 한정된 수량화를 도입하여 HM의 주요 유형 속성을 다시 얻는 시스템 F의 확장이기도합니다. 저자가 비교 한 결과, MLF는 HMF보다 강력하며 주석은 다형성으로 사용되는 매개 변수에만 필요합니다.
HM을 확장하는 또 다른 방법은 구속 조건 도메인의 변형을 통하는 것입니다.
HM (X)는 제약 도메인 X를 통해 파라미터 화 된 Hindley-Milner입니다.이 접근 방식에서 HM 알고리즘은 X에 대한 도메인 솔버로 전송되는 제약 조건을 생성합니다. 일반적인 HM의 경우 도메인 솔버는 통합 절차이며 도메인은 구성됩니다 용어 집합의 유형은 유형 및 유형 변수에서 빌드됩니다.
X의 또 다른 예는 Presburger 산술 언어 (이 경우 형식 유추 / 확인을 결정할 수 있음) 또는 Peano 산술 언어 (더 이상 결정할 수 없음)로 표현 된 제약 조건 일 수 있습니다. X는 다양한 유형의 이론에 따라 달라지며, 각각 필요한 유형 주석의 양과 지역화에 관한 자체 요구 사항이 있으며 전혀 또는 전혀 범위가 아닙니다.
Haskell의 형식 클래스는 형식의 형식 조건 MyClass(MyType)
자를 추가하여 제약 조건 도메인의 일종의 확장이기도합니다 (즉, MyType 형식에 대한 MyClass 인스턴스가 있음을 의미 함).
그들은 기본적으로 그들이 구현하는 (거의) 직교 개념이기 때문에 유형 클래스는 형식 유추를 유지 애드혹 다형성을 .
예를 들어, 상징 걸릴 val
유형을 val :: MyClass a => a
당신이 인스턴스를 가질 수있는 MyClass A
, MyClass B
형식 유추가 이미 컴파일러가 사용하는 클래스의 어떤 인스턴스를 추론 할 수 있음을 수행하기 때문에 코드에서 해당 심볼을 참조하는 경우 등, 실제로입니다. 이는 유형 val
이 사용되는 컨텍스트에 따라 다릅니다. 그렇기 때문에 단일 val
문장을 실행 하면ambiguous type error
: 컴파일러는 컨텍스트를 기반으로 유형을 유추 할 수 없습니다.
GADT, 유형 패밀리, 종속 유형, 시스템 (F) ω 등과 같은 고급 유형 시스템의 경우 유형은 더 이상 "유형"이 아니며 복잡한 계산 객체가됩니다. 예를 들어, 동일하게 보이지 않는 두 가지 유형이 반드시 다른 것은 아닙니다. 따라서 유형 평등은 사소한 것이 아닙니다 (전혀).
: 당신에게 실제 복잡성의 예를 제공하기 위해의 목록의 의존의 형태 생각 해보자 목록에있는 개체의 유형을이고 길이입니다.
append 함수는 type을 가지며 zip 함수는입니다 .
이제 람다가 있다고 상상해보십시오 . 여기서 zip의 첫 번째 인수는 type 이고 두 번째 인수 는 type 입니다.
거의 동일하지만 타입 체커가 "+"가 자연수에서 통근한다는 것을 알지 않는 한, (n + m)이 문자 그대로 (m + n)이 아니기 때문에 함수를 거부해야합니다. 더 이상 형식 유추 / 형식 검사에 관한 것이 아니라 정리 증명에 관한 것입니다.NList a n
a
n
append :: NList a n -> NList a m -> NList a (n + m)
zip :: NList a n -> NList b n -> NList (a, b) n
\a: NList t n, b: NList t m -> zip (append a b) (append b a)
NList t (n + m)
NList t (m + n)
액체 유형은 일부 종속 유형 유추를 수행하는 것으로 보입니다. 그러나 내가 이해하는 것처럼, 그것은 실제로 의존적 인 유형이 아니며 정적 경계를 계산하기 위해 추가 유추가 이루어지는 일반적인 HM 유형과 비슷합니다.
이게 도움이 되길 바란다.