Hindley-Milner Type Inferenceに関するウィキペディアの記事を読んで、意味を理解しようとしています。これまでのところ、これは私が理解したことです:
- タイプは、モノタイプまたはポリタイプのいずれかに分類されます。
intモノタイプは、型定数 (または などstring) または型変数 (αおよび など)としてさらに分類されますβ。- 型定数は、具象型 (
intや などstring) または型コンストラクタ ( やMapなど) のいずれかSetです。 - 型変数 (
αや などβ) は、具象型 (intや などstring) のプレースホルダーとして動作します。
今、私はポリタイプを理解するのに少し苦労していますが、Haskellを少し学んだ後、これが私が作るものです:
- 型自体に型があります。正式には、タイプのタイプはカインドと呼ばれます (つまり、タイプにはさまざまな種類があります)。
- 具象型 (
intや などstring) と型変数 (αや などβ) は一種*です。 - 型コンストラクタ (
Mapおよび などSet) は、型のラムダ抽象化です (たとえば、Setis of kind* -> *およびMapis of kind* -> * -> *)。
私が理解していないのは、修飾子が何を意味するのかということです。例えば何∀α.σを表しているのですか?私はそれの頭も尻尾も作ることができないようで、次の段落を読めば読むほど混乱します。
対照的に、ポリタイプ∀α.α -> αを持つ関数は、同じ型の任意の値をそれ自体にマップでき、恒等関数はこの型の値です。別の例として、∀α.(Set α) -> intは、すべての有限集合を整数にマッピングする関数の型です。メンバーの数は、このタイプの値です。修飾子はトップレベルにしか現れないことに注意してください。例えば、タイプ∀α.α -> ∀α.αはタイプの構文によって除外され、モノタイプはポリタイプに含まれるため、タイプは一般的な形式∀α₁ を持ちます。. . ∀αₙ.τ .