Hindley-Milner 타입 추론은 System-F 타입 시스템의 제한 인 Hindley-Milner 타입 시스템에 사용됩니다. HM 타입 시스템의 흥미로운 특징은 파라 메트릭 다형성 (일명 제네릭) 을 가지고 있다는 것 입니다. 이것이 Golang이 거부 한 가장 큰 단일 유형 시스템 기능입니다.
이러한 좌절스러운 제한으로 인해 HM 스타일의 유추는 불가능합니다. 형식화되지 않은 코드를 보자.
func f(a) {
return a.method()
}
유형은 f
무엇입니까? a
익명의 인터페이스를 사용할 수 있도록 메소드 가 있어야 함을 알 수 있습니다 func f(a interface { method() ??? }) ???
. 그러나 반환 유형이 무엇인지 모릅니다. 타입 변수를 사용하면 타입을 다음과 같이 선언 할 수 있습니다.
func f[T](a interface{ method() T }) T
그러나 Go에는 유형 변수가 없으므로 작동하지 않습니다. 암시 적 인터페이스는 형식 유추의 일부 측면을 더 쉽게 만들지 만 이제 함수 호출의 반환 형식을 찾을 수있는 방법이 없습니다. HM 시스템은 모든 함수가 묵시적인 것이 아니라 선언되어야하며 각 이름은 단일 유형 만 가질 수 있습니다 (Go의 메소드는 인터페이스마다 다른 유형을 가질 수 있음).
대신 Go는 함수가 항상 완전히 선언되어야하지만 변수가 형식 유추를 사용할 수 있도록해야합니다. 과제의 오른쪽 variable := expression
에 프로그램의 해당 지점에 이미 알려진 유형이 있기 때문에 가능 합니다. 이러한 유형의 유추는 간단하고 정확하며 선형입니다.
- 변수의 유형은 선언 시점에 즉시 알려져 있지만 HM 유추는 전체 프로그램을 먼저 형식 검사해야합니다. 이것은 오류 메시지의 품질에도 현저한 영향을 미칩니다.
- Go의 유형 추론 접근법은 가장 일반적인 유형을 선택하는 HM과 달리 항상 변수에 대해 가장 구체적인 유형을 선택합니다. 이것은 Go의 암시 적 인터페이스에서도 서브 타이핑과 함께 작동합니다.