Hindley-Milner 추론이 Go 언어에서 작동 할 수 있습니까?


22

나는 읽었습니다 힌들리 - 밀너는 서브 클래스가 타입 시스템으로 작업을하지 않으며, 또한 잘 작동하지 않는 다른 유형의 시스템 기능이 있습니다. Go는 현재 :=연산자 에서 형식 유추가 매우 제한되어 있습니다. 그러나 Go에는 전통적인 의미의 하위 클래스가 없으며 Hindley-Milner 추론에서 잘 작동하는 Haskell의 유형 클래스와 매우 유사한 인터페이스 만 있습니다.

따라서 Hindley-Milner 추론은 원칙적으로 Haskell과 같은 방식으로 Go에서 작동 할 수 있습니까? 아니면 Go에 다른 기능이 있습니까? 반면에 Haskell에는 프로그램의 해당 부분을 수동으로 입력해야하는 기능을 사용하는 경우 Hindly-Milner에서 작동하지 않는 기능도 있습니다.

답변:


35

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의 암시 적 인터페이스에서도 서브 타이핑과 함께 작동합니다.

24
@bishop "이유"의 무한한 작은 값에 대해서는 "합리적"입니다.
hobbs

18
@bishop 제네릭을 사용하여 언어로 컴파일러 작업을 수행 한 후에는 확실히 동의 할 수 있습니다. 구현을 크게 복잡하게하지 않으면 구현하기가 어렵습니다. 나는 "어려운"을 "불가능한"으로 대체하기 위해 갈 것입니다. 그러나 그것은 요점이 아닙니다. 요점은 여분의 합병증이 가치가 있습니까? 그리고 제네릭을 사용하거나 사용하지 않은 사람에게 해답은 "그렇습니다!"입니다. "아니오, 복잡성"이 바보이기 때문에 제네릭 구현을 거부한다는 주장에 전적으로 동의해야 할 것입니다.
메이슨 휠러

18
이것이 바로 Go 개발자들이 모든 종류의 FP가 나쁘다고 가장하는 이유입니다. 이동 어휘 폐쇄와 일류의 기능을 가지고 있으며, 능력 고차 함수를 만드는하지만 어떤 좋은 사용에 넣어 불가능두고 있기 때문에 이러한 기본 기능의 유형으로 map, filter그리고 reduce모든 이동의 매우 제한 내에서 말로 표현할 수없는입니다 유형 시스템.
hobbs

9
@hobbs 그리고 이동은 할 수 정말로 그 고정 된 경우 좋은 언어, 대신에 사람들은 같은 일반적인 세대 라이브러리를 작성해야 gengen하고gonerics
고양이

14
@cat 부끄러운 일이다. 처음에는 Go가 훌륭한 아이디어로 가득 찬 훌륭한 언어처럼 보이지만 상속 및 다형성이 없다는 것을 알고 있으므로 OOP를 잘 수행 할 수 없으며 제네릭이 없으므로 FP를 잘 수행 할 수 없으며 '그런데 얼마나 정확하게이 언어를 사용해야합니까?!'
메이슨 휠러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.