“free theorem 不是检查函数体后发现的偶然性质,而是把多态类型代入关系参数性所得的行为定理。推导通常包含四步:把类型翻译成关系命题;为类型变量选择能表达目标函数的关系;应用参数性基…”
形式陈述 ​
在纯、总的 System F 中,关系环境
全称类型要求保持每一种可选关系:
关系参数性或 abstraction theorem 是逻辑关系基本定理在这套解释上的实例:若
参数多态是一种类型系统能力;关系参数性是关于该语言全部良类型项的元定理。重载或 ad-hoc polymorphism 可以按类型选择不同实现,不满足上述“任意关系都保持”的前提,不能只因语法里有泛型参数就套用本定理。
直觉 ​
一个对未知
关系环境比只比较相同类型更有力。它可以把编码不同、值集合不同的两个类型联系起来;多态程序若仍保持该关系,就说明其行为不依赖任何一侧的具体表示。
例子与边界 ​
设 f 还可能永不返回。
对
底值、异常、引用、指针相等、类型反射、不安全转换以及 Haskell 风格 seq 都会改变可观察行为或允许程序探查本应抽象的信息。相应语言可能仍有经过 admissibility、world、step index 或部分性修正的参数性定理,但不能无条件沿用经典 Reynolds 版本。
推论与应用 ​
关系参数性支撑表示隐藏、程序等式和从多态类型导出的自然性条件。所谓 free theorem 是进一步选择特定关系并把关系结论化为程序等式的应用;推导时仍要写明总性、纯度和观察等价,不能把“代码复用”当成形式证明。
编译器若做类型擦除或多态优化,也可用参数性说明程序不能观察被擦除的类型信息。不过当源语言暴露运行时类型表示或字典参数时,证明必须把这些额外值纳入关系,而不是假定所有泛型语言都与纯 System F 相同。
参考资料
- John C. Reynolds, “Types, Abstraction and Parametric Polymorphism,” in Information Processing 83, 1983。
- Philip Wadler, “Theorems for Free!” FPCA, 1989。
- Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,parametricity and abstraction。