繁体   English   中英

Haskell中翻转function的定义

[英]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

现在我们几乎在那里。 在最终定义中,作者在各处交换了名称xy 我不知道他们为什么选择这么做,但这是您可以在方程式推理中做出的合法举动,所以在那里没有问题。 这样做为我们提供了最终方程:

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 = fyxgyx = fxy等效于alpha转换 在这两种情况下, fg的定义中都是自由变量; gf 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM