Types “类型检查”;让我们-在SystemF中高效地绑定/函数定义

Types “类型检查”;让我们-在SystemF中高效地绑定/函数定义,types,ocaml,Types,Ocaml,考虑以下(伪)OCaml代码: let foo = <something> in begin foo a foo b foo c ... foo z end 让foo=in 开始 福阿 富b 富科 ... 福兹 结束 (a-z是元变量,没有具体说明) 我读到[Pierce,TAPL,Ch.22.7],在ML风格的多态性中,类型检查可以通过计算“foo”的主要类型、泛化(从而引入ML风格的多态性)和检查身体中每出现一次“foo”的类型

考虑以下(伪)OCaml代码:

let foo = <something> in
  begin
    foo a
    foo b
    foo c
    ...
    foo z
  end
让foo=in
开始
福阿
富b
富科
...
福兹
结束
(a-z是元变量,没有具体说明)

我读到[Pierce,TAPL,Ch.22.7],在ML风格的多态性中,类型检查可以通过计算“foo”的主要类型、泛化(从而引入ML风格的多态性)和检查身体中每出现一次“foo”的类型(这里是26次)来有效地完成


现在我的问题是:如果我们在系统F中呢?如果不能通过约束类型算法验证函数的类型,该怎么办?当然,系统F的键入规则是存在的,但实现它们意味着您必须在每次调用“foo”时将每次出现的“foo”替换为“foo”,并重新检查“foo”。

系统F通常以明确键入的样式描述:函数 用参数的类型(
λ(x:σ).t
)和类型进行注释 抽象(
∧α.t
)和应用(
t[σ]
)出现在 语法

通过本演示,可以轻松计算术语的类型,例如 您的示例
。这种类型是独特的,尤其是“最通用的类型”:不可能出现混淆
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进行推理的尝试,请参阅 (自撰写本文(2004年)以来,雷米的MLF工作已经完成 Leijen和FPH分别进行了HML/HMF和FPH工作
在我看来,在系统F中,
foo
的类型必须由程序员提供,并且正是这种提供的类型将用于检查
foo a
。。。