Skip to content

定义Definition

参数多态

施工中 · 内容逐步修订

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,类型是 ∀α.α→α;实例化为整数或布尔类型仍使用同一函数体。在纯、总且不带类型反射的语言中,∀A.∀B.(A→B)→List A→List B 型函数不能凭空制造任意 B;输出元素只能来自给定函数对输入元素的应用。但这个类型并不强制保持列表长度或次序:总返回空列表、重复结果或逆序输出都可定型。通常的 map 逐项应用函数并保留列表结构,是其具体定义的保证;参数性给出的自然性等式不能代替这项算法规格。

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

推论与应用

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

若通用代码还需未知类型上的专属操作,可以用受约束类型方案保留Eq a等前提,而不是假装所有a都自带比较。字典传递翻译把该前提变成方法记录参数;两份同类型字典可能产生不同结果,因此译后类型正确与隐式证据选择一致是两项不同责任。

关系参数性可证明程序等价,表示独立性再把相关实现提升为客户端不可区分;在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。
关系图谱19 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

并列辨析