Golang / Haskell의 형식 유추


9

ML이나 Haskell과 같은 기능적 언어가 가지고 있다는 점에서 Go가 실제로 유형 유추가 아니라는 것을 읽었지만 두 버전의 비교를 이해하는 간단한 방법을 찾지 못했습니다. 누군가 Go의 유형 추론이 Haskell의 유형 추론 및 각각의 장단점과 어떻게 다른지 기본 용어로 설명 할 수 있습니까?

답변:


13

Go의 유형 유추에 관한 이 StackOverflow 답변을 참조하십시오 . 나는 Go 나 자신에 익숙하지 않지만이 답변을 기반으로 한 일방향 "유형 추론"처럼 보입니다 (일부 C ++ 용어를 빌리기 위해). 그것은 당신이 가지고 있다면 :

x := y + z

그런 다음의 유형을 x알아 냄으로써 의 유형 이 추론되는데 y + z, 이는 컴파일러에 대해 비교적 사소한 일입니다. 이렇게하려면 유형 y및 z필요 알려진 할 선험적 :이 유형의 주석을 통해 수행하거나 할당 된 리터럴에서 유추 할 수있다.


대조적으로, 대부분의 기능적 언어에는 변수의 유형을 도출하기 위해 모듈 (또는 추론 알고리즘이 로컬 인 경우 함수) 내에서 가능한 모든 정보를 사용하는 유형 추론이 있습니다. 복잡한 추론 알고리즘 (예 : Hindley-Milner)은 종종 배후에 어떤 형태의 통일 ( 일부 방정식 풀기와 같은)을 포함합니다. 예를 들어, Haskell에서 다음과 같이 쓰는 경우 :

let x = y + z

다음 하스켈 타입 단지 추측 할 수 x있지만, 또한 y하고 z당신이 그들에 추가를 수행하고 있다는 사실에 기초 간단합니다. 이 경우 :

x :: Num a => a
y :: Num a => a
z :: Num a => a

(소문자 는 C ++와 같은 다른 언어에서는 흔히 "일반"이라고 a하는 다형성 유형 을 나타냅니다 .이 Num a =>부분은 유형 지원에 추가 개념이 있음을 나타내는 제약 조건a 입니다.)

다음은 재귀 함수를 정의 할 수있는 고정 소수점 결합기입니다.

let fix f = f (fix f)

우리는 어디에도 타입을 f지정하지 않았으며, 타입을 지정하지도 않았지만 fixHaskell 컴파일러는 자동으로 다음을 알아낼 수 있습니다.

f :: t -> t
fix :: (t -> t) -> t

이것은 말합니다 :

  • 매개 변수 f는 임의의 유형 t에서 동일한 유형 으로의 함수 여야합니다 t.
  • fix유형의 매개 변수를 수신하고 유형 t -> t의 결과를 리턴하는 함수입니다 t.

4
더 정확히, 하스켈 그렇게 말할 수있는 x, y, z동일 Num, 에릭 형하지만 그들은 여전히 할 수있다 IntegerS, DoubleS, Ratio Integer로 ... 하스켈 다른 typeclasses에 대한 숫자 유형 사이의 임의의 선택을 기꺼이 만이 아니다.
— John Dvorak

7

Go의 타입 추론은 매우 제한적이고 매우 간단합니다. 하나의 언어 구성 (변수 선언)에서만 작동하며 단순히 오른쪽 유형을 가져 와서 왼쪽 변수의 유형으로 사용합니다.

Haskell의 형식 유추는 어디에서나 사용할 수 있으며 전체 프로그램의 형식을 유추하는 데 사용할 수 있습니다. 통일을 기반으로합니다. 즉 (개념적으로) 모든 유형이 "한 번에"추론되고 서로 영향을 줄 수 있습니다. Go에서 유형 정보는 변수 선언의 오른쪽에서 왼쪽으로 만 흐를 수 있습니다. 다른 방향으로 절대 변하지 않으며 변수 선언 밖에서는 절대로; Haskell에서는 유형 정보가 전체 프로그램을 통해 모든 방향으로 자유롭게 흐릅니다.

그러나 Haskell의 형식 시스템은 너무 강력하여 형식 유추가 실제로 형식을 유추 하지 못할 수 있습니다 (또는 더 정확하게는 형식을 항상 유추 할 수 있도록 제한을 설정해야 함). Go의 타입 시스템은 매우 단순하고 (서브 타이핑이없고, 파라 메트릭 다형성이 없음) 추론이 제한되어있어 항상 성공합니다.


4
"Haskell에서 유형 정보는 전체 프로그램을 통해 모든 방향으로 자유롭게 흐릅니다." +1
— 조르지오

마지막 단락에서이 답변의 주장은 약간 오해의 소지가 있습니다. 하스켈에는 하위 유형이 없습니다. 또한, 파라 메트릭 다형성은 타입 추론의 완전성에 아무런 문제를 일으키지 않습니다. 다형성 람다 미적분학의 Hindley-Milner는 항상 가장 일반적인 타입을 찾습니다. Haskell은 유형을 유추하지 못할 수 있지만 이것은 순진하게 공식화 될 때 주 (즉, "최상의 선택") 유형이 존재하지 않는 GADT와 같은 정교한 유형 시스템 기능에 있습니다.
— Edward Z. Yang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.