Golang / Haskellの型推論


9

Goには、MLやHaskellなどの関数型言語が持っているという意味で、実際には型の推論がないという事実を読んだことがありますが、2つのバージョンの比較を理解するのは簡単ではありません。Goの型推論がHaskellの型推論とどのように異なるか、およびそれぞれの長所と短所を基本的な用語で誰かが説明できますか?

回答:


13

Goの型推論に関するStackOverflowの回答をご覧ください。私はGoについてはあまり詳しくありませんが、この回答に基づくと、一方向の「型の推論」のように見えます(C ++の技術を借りる場合)。それはあなたが持っている場合、

x := y + z

次に、のタイプをx計算することにより、のタイプが推定されy + zます。これは、コンパイラーにとって比較的簡単なことです。これを行うには、の種類yz必要性は知られていることを演繹的に:これは、型注釈を介して行わまたはそれらに割り当てられたリテラルから推測することができます。


対照的に、ほとんどの関数型言語には、モジュール内のすべての可能な情報(または、推論アルゴリズムがローカルの場合は関数)を使用して変数の型を導出する型推論があります。複雑な推論アルゴリズム(Hindley-Milnerなど)は、多くの場合、舞台裏で何らかの形の型統一(方程式を解くのに少し似ています)を伴います。たとえば、Haskellで次のように記述したとします。

let x = y + z

その場合、Haskellはタイプを推測するだけでxなくyz単純に、それらを追加しているという事実に基づいて推測することもできます。この場合:

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

(ここでの小文字aは、C ++などの他の言語では「ジェネリック」と呼ばれることが多い多相型を示します。このNum a =>部分は、型のサポートに何らかの加算の概念があることを示すための制約aです。)

次に、より興味深い例を示します。再帰関数を定義できる固定小数点コンビネータです。

let fix f = f (fix f)

の型をどこにも指定してfおらず、またの型も指定していないことに注意してください。ただしfix、Haskellコンパイラは自動的に次のことを理解できます。

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

これはそれを言う:

  • パラメータfは、任意の型tから同じ型への関数でなければなりませんt
  • fixタイプのパラメータを受け取り、タイプt -> tの結果を返す関数ですt

4
より正確には、Haskellのはそれを伝えることができxyz同じNum、エリック・タイプではなく、彼らはまだすることができInteger、S、DoubleS、Ratio Integerよ... Haskellは、他の型クラスのための数値型の間の任意の選択をするために喜んで、しかしではありません。
John Dvorak

7

Goの型推論は非常に制限されており、非常に単純です。1つの言語構成(変数宣言)でのみ機能し、右側の型を取り、左側の変数の型として使用します。

Haskellの型推論はどこでも使用でき、プログラム全体の型を推論するために使用できます。これは統一に基づいています。つまり、(概念的に)すべての型が「一度に」推論され、それらはすべて互いに影響を及ぼします。Goでは、型情報は変数宣言の右側から左側にのみ流れることができます。反対側、変数宣言の外側には絶対に置かないでください。Haskellでは、型情報はプログラム全体を通じてあらゆる方向に自由に流れます。

ただし、Haskellの型システムは非常に強力なので、型推論は実際に型の推論に失敗する可能性があります(より正確には、型を常に推論できるように制限を設ける必要があります)。Goの型システムは非常に単純(サブタイピングなし、パラメトリック多態性なし)であり、その推論は非常に制限されているため、常に成功します。


4
「Haskellでは、タイプ情報はプログラム全体を通じてあらゆる方向に自由に流れます」:これは非常に良い直感を与えると思います。+1
ジョルジオ

この回答が最後の段落で行う主張は、少し誤解を招くものです。Haskellにはサブタイプはありません。さらに、パラメトリック多態性は、型推論の完全性に問題を引き起こしません。多態性ラムダ計算のHindley-Milnerは、常に最も一般的な型を見つけます。Haskellは型の推測に失敗する可能性がありますが、これはGADTのような洗練された型システムの機能であり、単純に定式化された場合、主要な(つまり、「最良の選択」)型が存在しません。
エドワードZ.ヤン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.