[英]Definition of the flip function in Haskell
目前我正在尝试通过“Learn You a Haskell”一书来学习 Haskell,并且我正在尝试了解第 5 章中flip
function 的实现。 问题是作者声明如果gxy = fyx
有效,那么fyx = gxy
也必须为真。 但是这种反转如何以及为什么会影响两个 function 定义?
我知道柯里化是如何工作的,而且我也知道->
运算符默认是右关联的,因此类型声明实际上是相同的。 我也了解彼此分开的功能,但不了解gxy = fyx
的反转与此有何关系。
第一次翻转 function
flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
where g x y = f y x
第二次翻转 function
flip' :: (a -> b -> c) -> b -> a -> c
flip' f y x = f x y
我认为作者脑海中的论点被粗略地缩写为一点都不合理。 但是这是我对推理的猜测。 我们从第一个定义开始:
flip f = g where g x y = f y x
现在我们观察到这是一个可咖喱的东西,并且我们使用(->)
和垃圾的所有关联性讨论来写相同的东西,但是对f
附加了两个参数。 像这样:
flip f x y = g x y where g x y = f y x
现在我们得到了他双向调用的方程: gxy = fyx
,反之亦然。 我们可以使用以下公式重写flip
的主体,如下所示:
flip f x y = f y x where g x y = f y x
由于定义的主体不再提及g
,因此我们可以将其删除。
flip f x y = f y x
现在我们几乎在那里。 在最终定义中,作者在各处交换了名称x
和y
。 我不知道他们为什么选择这么做,但这是您可以在方程式推理中做出的合法举动,所以在那里没有问题。 这样做为我们提供了最终方程:
flip f y x = f x y
flip
接受一个函数并返回该函数的翻转版本。 定义“ flip'
一种方法是将应用程序包含在定义本身中,因为
flip' f y x = f x y ===> flip' f y = \x -> f x y
===> flip' f = \y -> \x -> f x y
也就是说, flip' f
是函数,它以相反的顺序将f
应用于自己的参数。
第二个定义只是简单地给匿名函数\\y -> \\x -> fxy
一个名称,然后使用该名称作为flip' fxy
的定义。
===> flip' f = g where g = \y -> \x -> f x y
===> flip' f = g where g y = \x -> f x y
===> flip' f = g where g y x = f x y
即, flip' f
是一些功能g
,其中g
被定义为应用f
到的参数g
以相反的顺序。
定义gxy = fyx
和gyx = fxy
等效于alpha转换 。 在这两种情况下, f
在g
的定义中都是自由变量; g
是f
flip'
的f
参数的闭包。
如果您在这里寻找翻转的作用:
Prelude> pow x y = x ^ y
Prelude> pow 2 3
8
Prelude> flip pow 2 3
9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.