在系统F中有效地检查“let”-bindings / function定义

时间:2011-04-03 12:35:08

标签: types ocaml

考虑以下(伪)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”。

1 个答案:

答案 0 :(得分:2)

系统F通常以明确的类型描述:函数 用他们的参数类型(λ(x:σ).t)和类型注释 抽象(Λα.t)和应用程序(t[σ])存在于 语法。

通过此演示文稿,可以轻松计算术语的类型 你的例子<something>。这种类型是独一无二的,特别是它是“最通用的类​​型”:不存在混淆。 foo将具有此类型。如果是的话 箭头类型σ → τ,然后提供给foo的所有参数(ab ...) 必须有σ类型。如果是多态类型 Λα₁Λα₂...σ→τ,然后在使用它之前必须使用它 实例化变量α₁α₂等的值......你不能 写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等人。