Skip to content

Algorithm W

Algorithm W

为 Hindley–Milner 语言递归推导主类型方案的统一算法。

条目类型
算法

形式陈述

Algorithm W 是 Hindley–Milner 系统的语法导向类型推断算法。输入类型环境 Γ 与项 t,成功时返回替换 S 和单态类型 τ,满足 SΓt:τ。变量分支实例化环境中的类型方案;抽象为参数分配新鲜类型变量;应用递归推断函数与实参,并用一阶统一匹配函数类型和 τargβ;let 分支先推断绑定表达式,再相对更新后的环境泛化其类型。

在标准纯 HM 语言中,若 t 可定型,W 返回其主类型的一个实例;若统一失败,则不存在 HM 类型。替换的复合顺序和对环境及时应用是算法不变量的一部分,不能任意交换。

具体地,应用分支先计算 W(Γ,e1)=(S1,τ1),再计算 W(S1Γ,e2)=(S2,τ2);取新鲜变量 β 并令 US2τ1τ2β 的最一般统一子,最终返回

(US2S1,Uβ).

let 分支若先得到 W(Γ,e1)=(S1,τ1),则令 σ=gen(S1Γ,τ1),再在 S1Γ[xσ] 中推断 e2。这两处分步应用替换,正是避免旧约束与新约束脱节的关键。

直觉

W 沿语法树一边走一边积累“到目前为止必须成立的类型等式”。每遇到未知值就生成新鲜类型变量,每遇到应用就让统一算法校准插头与插座,所得替换立即改写后续世界。let 是唯一的多态关口:先把局部求出的类型中不受环境约束的变量封装成方案,之后每次使用再新鲜实例化。它不是试遍所有类型,而是始终维护最一般解,因此一次运行就得到整个类型族。

Algorithm W 的泛化与实例化
例子与边界

λf. λx. f x,W 为 f,x 分配新鲜类型 α,β,应用处统一 αβγ,最终得到 (βγ)βγ。对

let id = λx.x in (id 0, id true)

绑定处得到 αα 并泛化为 α.αα,两次使用分别新鲜实例化,因此可同时接受整数和布尔值。

边界是省略 occurs check:推断 λx. x x 时会产生 α=αβ,标准有限类型下应失败。W 也不推断任意高秩或多态递归类型;给它加入语言特性后,主类型和完备性可能不再成立。

推论与应用

W 把类型方案一阶统一HM 推断组合成可实现算法。编译器可据此补全省略的类型、生成错误信息,并在中间表示中插入显式类型信息。

实际实现常用约束生成与求解分离、union–find、等级或区域标记来高效实现泛化;但这些优化必须保持 W 的主类型语义。

参考资料
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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