【发布时间】:2013-03-07 23:58:34
【问题描述】:
我正在阅读关于Hindley–Milner Type Inference 的维基百科文章,试图从中理解。到目前为止,这是我所理解的:
- 类型分为单型或多型。
- Monotypes 进一步分为类型常量(如
int或string)或类型变量(如α和β)。 - 类型常量可以是具体类型(如
int和string)或类型构造函数(如Map和Set)。 - 类型变量(如
α和β)充当具体类型(如int和string)的占位符。
现在我在理解多型时有点困难,但是在学习了一点 Haskell 之后,我就是这样做的:
- 类型本身也有类型。类型的正式类型称为种类(即有不同种类的类型)。
- 具体类型(如
int和string)和类型变量(如α和β)属于*。 - 类型构造函数(如
Map和Set)是类型的 lambda 抽象(例如,Set类似于* -> *,Map类似于* -> * -> *)。
我不明白限定词是什么意思。例如∀α.σ 代表什么?我似乎无法理解它的正面或反面,我阅读以下段落的次数越多,我就越困惑:
相比之下,具有多类型 ∀α.α -> α 的函数可以将任何相同类型的值映射到自身,identity function 是这个类型。另一个例子 ∀α.(Set α) -> int 是将所有有限集映射到整数的函数类型。成员计数是此类型的值。请注意,限定符只能出现在顶层,例如,类型 ∀α.α -> ∀α.α 会被类型的语法排除在外,并且包含单型在多型中,因此类型具有一般形式 ∀α₁ 。 . . ∀αₙ.τ.
【问题讨论】:
标签: haskell type-inference type-systems lambda-calculus hindley-milner