“free theorem 不是检查函数体后发现的偶然性质,而是把参数多态类型代入关系参数性所得的行为定理。推导通常包含四步:把类型翻译成关系命题;为类型变量选择能表达目标函数的关系;应用参数…”
形式陈述
参数多态允许项对类型变量抽象,并对任意类型统一实例化。相应的类型判断可使用全称类型
这两条规则定义的是显式 System F 风格多态:程序写出类型抽象和类型应用,并可表达高阶、高秩乃至 impredicative 多态。Hindley–Milner 是不同的秩一接口:它在 let 处对类型方案做隐式泛化,并换取可判定的主类型推断。工程语言还可用单态化、字典传递或类型擦除实现泛型;这些是实现策略,而不是 System F 的类型规则。
“参数”表示程序只按类型变量在接口中的位置统一工作,而不能凭空使用未知类型的专属操作。把这种 uniformity 形式化为“保持任意关系”是关系参数性定理;进一步选择图关系并导出程序等式属于free theorem。二者是关于语言的元理论与应用,不是全称类型引入、消去规则本身。
直觉
参数多态把类型当作接口占位符:程序知道某些值类型相同,却不知道它们究竟是整数、字符串还是树。正因为缺少类型专有操作,代码被迫保持统一行为;一个纯函数若类型是
例子与边界
多态恒等函数为 ∀A.∀B.(A→B)→List A→List B 型函数不能凭空制造任意 map 逐项应用函数并保留列表结构,是其具体定义的保证;参数性给出的自然性等式不能代替这项算法规格。
边界是 printType : ∀A.A→String 一类能反射类型参数的原语:它可按
推论与应用
参数多态是泛型库、集合算法和类型安全复用的基础。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。