Skip to content

模型Model

Hindley–Milner 类型推断

施工中 · 内容逐步修订

Hindley–Milner type inference · HM type system

为带 let 的秩一参数多态 λ 演算提供主类型性质与可判定类型推断的系统。

形式陈述 ​

Hindley–Milner(HM)系统为带 λ、应用与 let 的纯函数核心语言提供隐式秩一参数多态。类型环境中的 let 绑定可具有类型方案,λ 绑定参数保持单态;声明式规则通过实例化与 let 泛化组织类型判断;一阶统一是随后构造推断算法时求解类型等式的工具。

相对于固定类型环境,HM 具有主类型性质:若项 t 可定型,则存在类型方案 σ,使 t 的任何其他可得类型都是 σ 的实例。类型推断可由Algorithm W完成;在适当表示下,其核心工作是生成并统一类型方程。该结论针对纯、无多态递归的标准系统,扩展语言后需重新核对。

直觉

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 通过全局约束统一寻找主类型。类型类、行多态与效应等扩展还需分别管理它们对可判定性和主类型的影响。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Ch. 22。
  • Robin Milner, “A Theory of Type Polymorphism in Programming,” Journal of Computer and System Sciences 17(3), 1978,pp. 348–375。
  • Luis Damas and Robin Milner, “Principal Type-Schemes for Functional Programs,” POPL, 1982,pp. 207–212。
关系图谱10 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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