Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 你如何证明函数的类型是唯一的?_Haskell_Types_Proof - Fatal编程技术网

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