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の暗黙的なインターフェイスであっても、サブタイピングで正常に機能します。