关于Haskell的Parametricity概念

Sof*_*dom 3 haskell

这是"第一原理的Haskell编程"一书中的一个问题.

我正在阅读上面提到的书,第5章,练习2:参数化.

复制了这本书.

通过查看 - > a - > a,我们可以更加舒适地了解参数.这个假设函数a - > a - > a有两个且只有两个实现.

我不明白"只有两个实现"部分?可以任何人向我解释为什么只有2个实现?

dop*_*ane 13

我认为"实施"这个词乍一看可能有点令人困惑.

假设我们只有函数类型f :: a -> a -> a,没有其他信息; 我们不允许偷看内心f.该函数必须返回一个a,您只有2个可能a的输入.因此该功能必须返回第一个a 第二个a; 只有2个可能的功能.

你不能拥有,f x y = x + y因为你不知道如何给+两个af :: a -> a -> a.如果你有,h :: Int -> Int -> Int那么,那h x y = x + y将是一个有效的功能,但你没有得到这些信息f.

同样,如果您拥有f :: a -> a -> a并且您声称f x y = x + y 有效,该怎么办?然后,我可以通过传递了两个破你的要求Fruits到f:f Apple Orange = ???.好Apple + Orange暧昧,代码不会工作.因此,保持类型多态"将可能的函数"限制为2个可能的"实现":f x y = xf x y = y.

这段视频让我明白了.我推荐整个视频,但链接是相关部分.(31:28)

它展示了类型级推理和参数化的强大功能.这种推理的所有信息都在类型中.

另一个例子,说你所拥有的只是一个函数类型g :: b -> b.好吧,函数必须返回一个b,唯一的参数是a,b所以必须返回 b.因此,只有一种这样的函数具有类型b -> b.

  • 部分函数有参数化,它只是有点复杂,但你仍然可以从类型中推导出规律.但是我认为每个人都在实践中使用全部法律; 在实际的Haskell中,假装一切都是大部分时间是非常好的,如果事情变得非常微妙,就将底部作为逃生舱.但总的来说,所谓的"快速而宽松",推理效果很好. (5认同)
  • @Will,任何签名的任何函数都可以返回`undefined`.它可以在不检查其参数/参数的情况下做到这一点.所以它不算作参数.您的无限递归示例根本不返回,因此它们也不计算在内.@DavOS:很好的答案! (3认同)
  • @AntC是的,这就是我所说的"他们都'返回'`undefined`"(错误和循环都被视为*底*).所以打折*那种"解决方案"*,确实是两个.但我们确实需要打折它们. (2认同)