系统F中的类型示例,在Hindley Milner类型推断中不可用

时间:2014-06-02 13:28:36

标签: types type-inference inference hindley-milner system-f

'What is Hindley Milner'下,它声明:

  

Hindley-Milner是System F的限制,它允许更多类型但需要程序员注释。

我的问题是,系统F中可用类型的示例是什么,在Hindley Milner(类型推断)中不可用?

(假设系统F类型的推断已被证明是不可判定的)

2 个答案:

答案 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类型系统中表达,因为参数中有类型量词。