Hindley-Milner推論はGo言語で機能しますか?


22

私は、Hindley-Milnerがサブクラスを持つ型システムでは機能しないことを読みましたが、他の型システム機能でも機能しないことがあります。現在、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それは、「理由」の非常に小さな値に対して「理由がある」。
ホッブズ

18
@bishopジェネリックを使用した言語でコンパイラーの作業を行ったことで、私は確かに同意できます。実装を大幅に複雑化せずに実装することは困難です。「難しい」を「不可能」に置き換えることさえしたい。ただし、それはポイントではありません。ポイントは、それは余分な複雑さの価値があるということですか?そして、ジェネリックの有無に関わらず働いている人への答えは、明らかに「はい、間違いなく!」です。「ああ、いや、複雑さ」はばかげているので、ジェネリックの実装を拒否するという主張に心から同意する必要があります。
メイソンウィーラー

18
これが、Go開発者があらゆる種類のFPが悪いと見せかける理由でもあります。ゴーは、字句クロージャとファーストクラスの機能を持ち、能力は高階関数を作成するが、それは何か良いの使用にそれらを置くことは不可能だとしているため、このような基本的な機能の種類としてmapfilter、およびreduceすべてのゴーの非常に限ら内で言い表せないです型システム。
ホッブズ

9
@hobbs And Goは、それが修正されれば本当に素晴らしい言語になる可能性がありますが、代わりに次のようなジェネリック生成ライブラリを作成する必要がgengenあります。gonerics
cat

14
@catそれは残念です。最初はGoは素晴らしいアイデアに満ちた素晴らしい言語のように見えますが、継承とポリモーフィズムがないため、OOPをうまく実行できず、ジェネリックがないため、FPをうまく実行できません「画面をじっと見つめて、「この言語をどのくらい正確に使用する予定ですか?!?」
メイソンウィーラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.