Haskell 你如何证明函数的类型是唯一的?
Haskell 你如何证明函数的类型是唯一的?,haskell,types,proof,Haskell,Types,Proof,id是类型a->a的唯一函数,并且 fst类型的唯一功能(a,b)->a。在这些简单的情况下,这是相当直观的。但总的来说,你会如何证明这一点?如果同一类型有多个可能的函数呢 或者,给定函数的类型,如何派生该类型的唯一(如果这是真的)函数 编辑:我特别感兴趣的是,当我们开始向类型中添加约束时会发生什么。您正在寻找的结果源自Reynolds的参数性,最著名的是Wadler在年所展示的 我所见过的证明基本参数性结果的最优雅的方法是使用“单例类型”的概念。基本上,给定任何ADT data Nat = Z
id
是类型a->a
的唯一函数,并且
fst
类型的唯一功能(a,b)->a
。在这些简单的情况下,这是相当直观的。但总的来说,你会如何证明这一点?如果同一类型有多个可能的函数呢
或者,给定函数的类型,如何派生该类型的唯一(如果这是真的)函数
编辑:我特别感兴趣的是,当我们开始向类型中添加约束时会发生什么。您正在寻找的结果源自Reynolds的参数性,最著名的是Wadler在年所展示的 我所见过的证明基本参数性结果的最优雅的方法是使用“单例类型”的概念。基本上,给定任何ADT
data Nat = Zero | Succ Nat
存在索引族(也称为GADT)
我们可以通过“删除”非类型语言的所有类型来给我们的语言赋予语义,Nat
和SNat
删除相同的内容。然后,根据语言的打字规则
id (x :: SNat n) :: SNat n
SNat n
只有一个居住者(它的单体),因为语义是通过擦除给出的,所以函数不能使用它们的参数类型,所以在任何Nat
上从id
返回的唯一值是您给它的数字。这个基本论点可以扩展到证明大多数参数性结果,Karl Crary在中使用了这个论点。虽然我在这里的演讲是受的启发而变得迂腐,但我认为人们通常会说,id
是a->a
类型的唯一“有趣”或“总体”函数<代码>未定义可以是Haskell中的任何类型,但它不是一个有用的函数。您可能还对Djinn感兴趣,这是一个可以从类型生成函数的程序,@JohnL Djinn实际上并没有证明唯一性,是吗?如果它存在的话,它只会找到这种类型的函数。这个问题可能更适合@MikeIzbicki,这是一个很好的观点。但是,Djinn将找到多种解决方案(例如,f?(a,a,b)->a
将找到两种答案)。如果列表是详尽的(我不知道它是否详尽),那么确定唯一性是微不足道的。@JohnL-djinn不会生成所有函数;至少在所有的情况下都不要——考虑<代码> f:浮点>浮点< /代码>
id (x :: SNat n) :: SNat n