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