了解翻转功能

时间:2019-06-04 06:06:36

标签: haskell functional-programming higher-order-functions

我正在从“了解Haskell带来的好处!”中学习高阶函数。由Miran Lipovaca撰写。

对于下面的函数翻转,它接受一个函数并返回一个带有翻转的前两个参数的函数:

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

我不确定fg是什么。它们是两个不同的功能吗?同样,在where绑定中,g x y = f y x到底是什么意思?

2 个答案:

答案 0 :(得分:5)

使用语法:

myFunction x = x + 2
等号x左侧的

视为“参数”。您可以在等号的右手符号上使用它们,以声明想要的结果。

此语法定义了具有单个参数myFunction的函数x

所以我们有:

flip' f = g

这定义了具有单个参数flip'的函数f

我们还有另一个定义:

g x y = f y x

这定义了一个函数g,具有两个参数xy

所以当我们说:

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

我们说flip f的结果是函数g,其中g被定义为g x y = f y x

如果简短的变量名使您感到困惑,这里是相同的函数,其中一些名称为了清楚起见被交换了:

flippity flop = glop
  where
    glop x y = flop y x

查看您是否可以理解flippity的功能,并查看它是否与flip'相同,只是内部参数和辅助函数的名称不同。

在Haskell中还请记住,在大多数情况下,我们总是可以用函数体替换函数调用。因此我们可以将其重写为:

flippity flop = glop
  where
    glop = \x y -> flop y x

-- replace glop with its definition

flippity flop = \x y -> flop y x

因此我们可以看到flippity是一个接受函数flop并返回新函数\x y -> flop y x的函数。

答案 1 :(得分:5)

fflip'的输入(要翻转的函数),gflip'的输出(它将返回的翻转函数)。

where子句只是定义g是什么;也就是说,定义一个简单地调用f并反转其参数的函数。

只需让g返回一个lambda,就可以避免完全命名flip'

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