Skip to content

模型Model

System F

施工中 · 内容逐步修订

System F · Polymorphic lambda calculus

具有显式类型抽象与类型应用的二阶多态 λ 演算。

形式陈述 ​

System F(二阶多态 λ 演算)扩展简单类型 λ 演算,其类型与项包含

T::=α∣T→T∣∀α.T,t::=x∣λx:T.t∣tt∣Λα.t∣t[T].

类型抽象规则要求 α 不自由出现于项变量上下文:从 Γ⊢t:T 抽象出 Λα.t:∀α.T 时,已有假设不能偷偷依赖所量化的 α。例如由假设 x:α 得到 x:α,不能直接泛化成 Λα.x:∀α.α,否则会把一个只适用于特定类型的外部值当成适用于所有类型的值。类型应用则把全称量化变量替换为任意良构类型。计算除项级 β-归约外还有类型级规则

(Λα.t)[T]→t[α:=T].

量化是 impredicative 的:∀α.T 可实例化为包含全称量化的类型。System F 中良类型项强正规化。对上面这种显式写出类型抽象、类型应用与参数类型的 Church-style 语法,类型检查是可判定的;擦除这些类型信息后,Curry-style System F 的 typability 与一般类型检查均不可判定。

直觉

简单类型 λ 演算要求每个函数固定在某个具体参数类型上,System F 允许函数再对类型本身抽象。Λα 表示“接下来这段程序对任意类型 α 都成立”,类型应用则选择一个实例。impredicativity 的力量在于多态值可以用含全称量化的类型实例化,这带来丰富编码;当类型抽象与实例化位置不再显式给出时,推断问题也随之越过可判定边界。类型参数在运行时通常可擦除,因为纯 System F 项不能检查它到底是哪种类型。

例子与边界

多态恒等函数

id=Λα.λx:α.x

具有类型 ∀α.α→α。若增加布尔基类型及其常量,归约分两步:id[B]true→(λx:B.x)true→true。第一步替换类型,第二步替换项;纯语法中的布尔也可用 Church 编码给出,其类型是 ∀α.α→α→α,自然数可赋类型 ∀α.(α→α)→α→α。

令 I=∀α.α→α,则 id[I]:I→I,所以 id[I]id:I 良类型并归约到 id。这里把一个多态类型传给类型参数,具体展示了 impredicative 实例化;它与无类型项 xx 不同,应用前有明确的类型实例化步骤。

边界是把 System F 与 Hindley–Milner 混同。前者允许多态参数在任意位置并要求显式类型抽象,表达力更强;后者主要在 let 绑定处作秩一泛化,因而拥有主类型与可判定推断。

纯 System F 的强正规化还依赖没有一般递归;加入固定点算子后仍可维持进展与保持,却会立即失去“所有良类型项都终止”的结论。

推论与应用

System F 是参数多态的标准核心演算,许多泛型语言的中间表示都可翻译到它或其扩展。关系参数性是关于良类型 System F 项保持任意关系的抽象定理,不反向成为演算语法的前置。存在类型可在 impredicative System F 中通过全称量化编码,并为抽象表示提供隐藏接口;原生 pack/unpack 的规则仍应与该编码区分。

其强正规化连接类型化正规化与二阶直觉主义逻辑;在Curry–Howard 对应下,System F 对应二阶命题逻辑。

现代编译器常使用更丰富的System Fω、带类型类或显式强制的核心。Fω不仅让项对普通类型量化,还让类型算子接收类型参数并进行β计算;先用kind判断区分List与List Int,才能检查这种高阶接口。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Chs. 23–24, System F syntax, typing, and metatheory。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,多态类型抽象与参数多态。
关系图谱11 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系

被这些条目使用