id
是a -> a
类型的唯一函数,并且
fst
类型(a,b) -> a
的唯一功能。在这些简单的情况下,这是非常简单的。但总的来说,你会如何证明这一点?如果有多个相同类型的可能功能怎么办?
或者,给定函数的类型,如何导出该类型的唯一(如果这是真的)函数?
编辑:当我们开始在类型中添加约束时,我特别感兴趣。
答案 0 :(得分:15)
您正在寻找的结果来自雷诺兹的参数化,并且是Wadler在theorems for free中最为人所知的。
证明基本参数化结果的最优雅方法我见过使用“单例类型”的概念。基本上,给定任何ADT
data Nat = Zero | Succ Nat
存在索引族(也称为GADT)
data SNat n where
SZero :: SNat Zero
SSucc :: SNat n -> SNat (Succ n)
我们可以通过将所有类型“删除”为无类型语言来为我们的语言提供语义,以便Nat
和SNat
擦除相同的内容。然后,按语言的输入规则
id (x :: SNat n) :: SNat n
SNat n
只有一个居民(它的单身人士),因为语义是通过擦除来给出的,所以函数不能使用他们的参数类型,所以id
可以在Nat
上返回唯一值{{1}} 1}}是你给它的数字。这个基本论证可以扩展到证明大多数参数化结果,并由Karl Crary在A Simple Proof Technique for Parametricity Results中使用,尽管我在这里的演示文稿受到Stone and Harper的启发