首页 > 解决方案 > Haskell中翻转函数的定义

问题描述

目前我正在尝试通过“Learn You a Haskell”一书来学习 Haskell,并且我正在尝试了解第 5 章flip中函数的实现。问题是作者说如果是有效的,那么也必须是真的。但是这种反转如何以及为什么会影响两个函数定义?g x y = f y xf y x = g x y

我知道柯里化是如何工作的,而且我也知道->默认情况下运算符是右关联的,因此类型声明实际上是相同的。我也了解彼此分开的功能,但不了解反转g x y = f y x与此之间的关系。

第一次翻转功能

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
    where g x y = f y x

二次翻转功能

flip' :: (a -> b -> c) -> b -> a -> c
flip' f y x = f x y

标签: haskellfunctional-programminghigher-order-functions

解决方案


我认为作者头脑中的论点被疯狂地简化到甚至没有意义的地步。但这是我对推理的猜测。我们从第一个定义开始:

flip f = g where g x y = f y x

现在我们观察到这是一个 curried 的东西,我们使用所有关于(->)和 junk 的关联性的讨论来写同样的东西,但是有两个额外的参数 to f。像这样:

flip f x y = g x y where g x y = f y x

现在我们有了他所说的双向方程式:g x y = f y x反之亦然。我们可以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

推荐阅读