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

haw*_*eye 8 types inference type-inference hindley-milner system-f

根据'什么是Hindley Milner',它说:

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

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

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

And*_*erg 11

Hindley/Milner不支持更高级别的多态类型,即通用量词嵌套到某个更大类型(即任何一类多态的概念)的类型.

最简单的例子之一是例如:

f : (??. ? ? ?) ? int × string
f id = (id 4, id "boo")
Run Code Online (Sandbox Code Playgroud)

众所周知,推断更高级别的多态性是不可判定的.类似的限制适用于递归:递归定义不能具有多态递归用法.对于一个人为的例子:

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")
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,这并不令人惊讶,并且像上面这样的递归定义只是在多态类型中应用高阶Y组合子的简写,这将再次需要(不可预测的)第一类多态性.


Pet*_*lák 8

是的,JB Wells在Typeability中已经证明系统F类型推断是不可判定的,并且系统F中的类型检查是等效且不可判定的.

HM类型系统仅允许在类型表达式的顶级上使用类型量词.更确切地说,HM区分类型,其中不能包含量词,和类型的模式:

type:= type variable | 类型→类型

type schema:= type | ∀α.类型架构

并且使用类型schemata键入多态表达式.

因此,任何在类型表达式中具有类型量词的类型(特别是在→的左侧部分内)都不能在HM类型系统中表达.

一个例子可以是教堂数字的输入.它们在系统F中的类型是??.(???)?(???),虽然这可以用HM表示,但我们不能表达教堂数字用作参数的类型.例如,如果定义教会数字的取幂

(?mn.nm) : (??.(???)?(???)) ? (??.(???)?(???)) ? (??.(???)?(???))
Run Code Online (Sandbox Code Playgroud)

由于参数中的类型量词,因此不能在HM类型系统中表示此类型.