Skip to content

参数多态

Parametric polymorphism

程序对类型参数统一工作而不依赖其具体表示的多态。

条目类型
定义

形式陈述

参数多态允许项对类型变量抽象,并对任意类型统一实例化。相应的类型判断可使用全称类型 α.T、类型抽象 Λα.t 与类型应用 t[A]

Γt:TαFV(Γ)ΓΛα.t:α.T,Γt:α.TΓt[A]:T[A/α].

这两条规则定义的是显式 System F 风格多态:程序写出类型抽象和类型应用,并可表达高阶、高秩乃至 impredicative 多态。Hindley–Milner 是不同的秩一接口:它在 let 处对类型方案做隐式泛化,并换取可判定的主类型推断。工程语言还可用单态化、字典传递或类型擦除实现泛型;这些是实现策略,而不是 System F 的类型规则。

“参数”表示程序只按类型变量在接口中的位置统一工作,而不能凭空使用未知类型的专属操作。把这种 uniformity 形式化为“保持任意关系”是关系参数性定理;进一步选择图关系并导出程序等式属于free theorem。二者是关于语言的元理论与应用,不是全称类型引入、消去规则本身。

直觉

参数多态把类型当作接口占位符:程序知道某些值类型相同,却不知道它们究竟是整数、字符串还是树。正因为缺少类型专有操作,代码被迫保持统一行为;一个纯函数若类型是 α.αα,除了返回输入外几乎没有别的总行为。它不同于重载:重载可为不同类型选择不同实现;也不同于子类型多态,后者依赖类型层次中的替代关系。类型限制为何能推出这些行为结论,由关系参数性及其具体实例负责证明。

例子与边界

多态恒等函数为 Λα.λx:α.x,类型是 α.αα;实例化为整数或布尔类型仍使用同一函数体。多态映射 map : ∀A.∀B.(A→B)→List A→List B 不能凭空制造 B,只能把给定函数应用到列表元素并保留结构。

边界是 printType : ∀A.A→String 一类能反射类型参数的原语:它可按 A 分支,不再满足纯 System F 的经典关系解释。不安全强制转换、指针相等、非终止和效果也会改变可推出的等式;这不影响“程序可对类型抽象”的基础定义,却要求使用相应语言版本的参数性定理。

推论与应用

参数多态是泛型库、集合算法和类型安全复用的基础。System F提供显式的高阶多态核心,Hindley–Milner 则以秩一类型方案和 let 泛化提供可推断的隐式版本。

关系参数性可证明程序等价,表示独立性再把相关实现提升为客户端不可区分;在Curry–Howard 对应下,全称类型对应二阶全称量化。

参考资料
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Ch. 23, universal types and parametricity。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,Chs. 10–11, polymorphism and abstraction。
关系图谱13 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

并列辨析