“W 把类型方案、一阶统一和HM 推断组合成可实现算法。编译器可据此补全省略的类型、生成错误信息,并在中间表示中插入显式类型信息。”
“固定纯Hindley–Milner语言,项由变量、整数和布尔常量、λ、应用、非递归 let 与二元组构成。单态类型和方案为”
模型Model
施工中 · 内容逐步修订
Hindley–Milner type inference · HM type system
为带 let 的秩一参数多态 λ 演算提供主类型性质与可判定类型推断的系统。
Hindley–Milner(HM)系统为带 λ、应用与 let 的纯函数核心语言提供隐式秩一参数多态。类型环境中的 let 绑定可具有类型方案,λ 绑定参数保持单态;声明式规则通过实例化与 let 泛化组织类型判断;一阶统一是随后构造推断算法时求解类型等式的工具。
相对于固定类型环境,HM 具有主类型性质:若项
HM 的巧妙之处是让程序员省略类型参数和多数注解,编译器却仍能找到最一般的答案。应用产生“函数参数类型必须等于实参类型”的方程,统一算法传播这些等式;let 则把与外部环境无关的未知类型泛化,使同一函数在不同位置独立实例化。主类型像约束信息的最小承诺:它没有过早选定具体类型,却能生成所有合法特例。秩一限制牺牲了把任意多态函数作为参数的表达力,换来可判定、完备的推断。
对组合函数 λf. λg. λx. f (g x),推断得到
它是所有具体组合函数类型的主类型。let id = λx.x in (id 0, id true) 通过 let 泛化成立,而把 id 改成普通 λ 参数时不再自动获得多态实例。
边界首先来自效果。值限制用同一个引用先写整数列表、再误读成布尔列表的执行,说明为什么一次分配结果不能任意泛化;λ工厂则通过每次新建单元避免错误共享。
多态递归让递归体内的自调用在不同元素类型上实例化,例如从Perfect a递归到Perfect(a×a)。高秩参数则把全称量词保留在函数箭头左侧,使同一个参数能在一次调用里处理Int与Bool。这两项都超出标准HM的单态递归/参数假设,需要明确的注解与检查纪律。
HM 奠定 ML、OCaml、Haskell 核心类型推断的基础。类型方案表达 let 多态,一阶统一求解约束,Algorithm W 给出构造性主类型算法。
主类型支持模块化错误定位和泛型库复用;现代语言常让 HM 推断服务于代数数据类型构造与模式,但和、积、递归的数据定义不是 HM 核心推断规则的前置。双向类型检查则以局部的 synthesis/checking 方向和必要注解组织信息,区别于 HM 通过全局约束统一寻找主类型。类型类、行多态与效应等扩展还需分别管理它们对可判定性和主类型的影响。
正在载入交互图谱…