在'What is Hindley Milner'下,它声明:
Hindley-Milner是System F的限制,它允许更多类型但需要程序员注释。
我的问题是,系统F中可用类型的示例是什么,在Hindley Milner(类型推断)中不可用?
(假设系统F类型的推断已被证明是不可判定的)
答案 0 :(得分:11)
Hindley / Milner不支持更高级别的多态类型,即通用量词嵌套到某种更大类型(即任何一类多态性概念)的类型。
最简单的例子之一就是例如:
f : (∀α. α → α) → int × string
f id = (id 4, id "boo")
一般来说,推断更高级别的多态性是不可判定的。类似的限制适用于递归:递归定义不能使用多态递归。一个人为的例子:
g : ∀α. int × α → int
g (n,x) = if n = 0 then 0 else if odd n then g (n-1, 3) else g (n-1, "boo")
鉴于上述情况,这有点不足为奇,并且像上面这样的递归定义只是在多态类型中应用高阶Y组合子的简写,这将再次需要(不可预测的)一类多态性
答案 1 :(得分:8)
是的,J.B. Wells在Typability and type checking in System F are equivalent and undecidable中已经证明系统F类型推断是不可判定的。
H-M类型系统仅允许类型表达式的顶级类型量词。更准确地说,H-M区分类型,它们不能包含量词,类型模式:
type:= type variable | type→type
type schema:= type | ∀α。类型架构
使用类型schemata键入多态表达式。
因此,任何在类型表达式中具有类型量词的类型(特别是在→的左侧部分内)都不能在HM类型系统中表达。
一个例子可能是Church numerals的输入。系统F中的类型为∀α.(α→α)→(α→α)
,虽然单独使用HM表示,但我们无法表达使用教会数字作为参数的类型。例如,如果在教会数字上定义指数
(λmn.nm) : (∀α.(α→α)→(α→α)) → (∀α.(α→α)→(α→α)) → (∀α.(α→α)→(α→α))
这种类型不能在HM类型系统中表达,因为参数中有类型量词。