我正在阅读有关Hindley–Milner 类型推断的 Wikipedia 文章,试图从中理解。到目前为止,这是我所理解的:
- 类型分为单型或多型。
- Monotypes 进一步分为类型常量(如
int
orstring
)或类型变量(如α
andβ
)。 - 类型常量可以是具体类型(如
int
andstring
)或类型构造函数(如Map
andSet
)。 - 类型变量(如
α
和β
)充当具体类型(如int
和string
)的占位符。
现在我在理解多型时有点困难,但是在学习了一点 Haskell 之后,这就是我所做的:
- 类型本身也有类型。类型的正式类型称为种类(即有不同种类的类型)。
- 具体类型(如
int
和string
)和类型变量(如α
和β
)是 kind*
。 - 类型构造函数(如
Map
和Set
)是类型的 lambda 抽象(例如Set
is of kind* -> *
和Map
is of kind* -> * -> *
)。
我不明白的是限定词是什么意思。例如∀α.σ
代表什么?我似乎无法对它做出正面或反面,我阅读以下段落的次数越多,我就越困惑:
相反,具有多型∀α.α -> α的函数可以将同一类型的任何值映射到自身,并且恒等函数是该类型的值。另一个例子∀α.(Set α) -> int是将所有有限集映射到整数的函数类型。成员计数是此类型的值。请注意,限定符只能出现在顶层,例如类型∀α.α -> ∀α.α被类型的语法排除,并且单型包含在多型中,因此类型具有一般形式∀α₁ 。. . ∀αₙ.τ。