考虑以下(伪)OCaml代码:
let foo = <something> in
begin
foo a
foo b
foo c
...
foo z
end
(a-z是metavariables,没什么特别的)
我读过[Pierce,TAPL,Ch。 22.7]在ML风格的多态性中,类型检查可以通过计算“foo”的主体类型,推广(从而引入ML样式的多态性)并针对身体中每次出现的“foo”检查该类型来有效地完成(这将是26次。)
现在我的问题是:如果我们在System F中怎么办?如果您无法通过约束类型算法验证函数的类型,该怎么办?当然,系统F的输入规则存在,但实现它们意味着你必须用“&lt; something&gt;”替换每个出现的“foo”。并重新检查“&lt; something&gt;”每当你打电话给“foo”。
答案 0 :(得分:2)
系统F通常以明确的类型描述:函数
用他们的参数类型(λ(x:σ).t
)和类型注释
抽象(Λα.t
)和应用程序(t[σ]
)存在于
语法。
通过此演示文稿,可以轻松计算术语的类型
你的例子<something>
。这种类型是独一无二的,特别是它是“最通用的类型”:不存在混淆。 foo
将具有此类型。如果是的话
箭头类型σ → τ
,然后提供给foo
的所有参数(a
,b
...)
必须有σ
类型。如果是多态类型
Λα₁Λα₂...σ→τ
,然后在使用它之前必须使用它
实例化变量α₁
,α₂
等的值......你不能
写foo a
但应改写foo[τ₁][τ₂][..] a
。
这可以为你提供与ML:in中相同数量的多态性 ML,透明地添加了抽象(let的概括) 绑定)和消除(使用场所的实例)。明确地说 系统F,你手动完成。
例如:
let id = Λα.λ(x:α).x in
(id [int] 1, id [string] "foo", id [∀α. α → α] id)
还有其他不同程度的系统F演示 隐含性,重新获得显性的推理问题 类型并不总是可判定的。您可以将ML视为特定推断 隐式系统F的过程,在某种意义上是不完整的 它不会接受所有可在系统中排除的条款 F.有关对完整系统F进行推理的尝试,请参阅this summary (自撰写本文时(2004年)起,雷米的MLF工作已经开始 进步,并导致Leijen和FPH的HML / HMF工作 Vytionitis等人。