Skip to content

类型方案

Type scheme · Polytype

通过显式量化类型变量表示一族单态类型的多态对象。

条目类型
定义

形式陈述

类型方案是表达参数多态的一种方式,形如

σ=α1αn.τ

的多态类型,其中 τ 是单态类型,量化变量可在使用时替换为新鲜单态类型。按自由变量与约束变量的区分,方案的自由类型变量为 FTV(σ)=FTV(τ){α1,,αn}。在 Hindley–Milner 的类型判断中,类型环境把变量映射到类型方案;读取变量时实例化量化变量,let 绑定时则相对于环境泛化

gen(Γ,τ)=(FTV(τ)FTV(Γ)).τ.

未被量化的类型变量仍受当前上下文约束,不能任意实例化。

直觉

类型方案不是一个“包含未知量的单类型”,而是一份可反复生成单态实例的模板。每次使用多态变量都要把量化变量换成新的类型变量,否则两次调用会被错误地强迫成同一类型。泛化时排除环境中的自由变量同样关键:这些变量代表外部已经共享的约束,擅自量化会把一份单态资源伪装成多态。类型方案位于可推断性与表达力的折中点,只提供外层全称量化,却足以覆盖大量泛型代码。

例子与边界

恒等函数的方案是 α.αα。在 let id = λx.x in (id 0, id true) 中,两次读取 id 分别实例化为 ZZBB,因此整个表达式良类型。

边界是 λ 绑定参数:标准 Hindley–Milner 不会把 λf.(f 0, f true) 中的 f 自动视为多态方案,因而该项不可定型。多态递归和高秩参数也超出普通类型方案推断,需要显式注解或更强系统。

推论与应用

类型方案是Hindley–Milner 类型推断中 let 多态的表示,Algorithm W在变量处实例化、在 let 处泛化。一阶统一只求解生成的单态约束,量化边界由方案机制管理。

在实现上,方案使泛型函数无需复制源代码即可安全复用;带可变状态的语言还需值限制,避免把具有分配效果的表达式不安全地泛化。

参考资料
关系图谱11 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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