“一阶统一是Hindley–Milner 类型推断的约束求解核心:类型构造器扮演函数符号,类型变量扮演一阶变量。Algorithm W在应用处统一函数类型与实参类型,并把得到的替换传播到环境。”
形式陈述 ​
Algorithm W 是 Hindley–Milner 系统的语法导向类型推断算法。输入类型环境
在标准纯 HM 语言中,若
具体地,应用分支先计算
let 分支若先得到
直觉
W 沿语法树一边走一边积累“到目前为止必须成立的类型等式”。每遇到未知值就生成新鲜类型变量,每遇到应用就让统一算法校准插头与插座,所得替换立即改写后续世界。let 是唯一的多态关口:先把局部求出的类型中不受环境约束的变量封装成方案,之后每次使用再新鲜实例化。它不是试遍所有类型,而是始终维护最一般解,因此一次运行就得到整个类型族。
例子与边界
对 λf. λx. f x,W 为
let id = λx.x in (id 0, id true),
绑定处得到
边界是省略 occurs check:推断 λx. x x 时会产生
推论与应用
W 把类型方案、一阶统一和HM 推断组合成可实现算法。编译器可据此补全省略的类型、生成错误信息,并在中间表示中插入显式类型信息。
实际实现常用约束生成与求解分离、union–find、等级或区域标记来高效实现泛化;但这些优化必须保持 W 的主类型语义。
参考资料
- Robin Milner, A Theory of Type Polymorphism in Programming (1978), algorithm W.
- Luis Damas, Robin Milner, Principal Type-Schemes for Functional Programs (1982), principal type schemes.