了解翻转功能

cen*_*980 1 haskell functional-programming higher-order-functions

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

对于以下函数flip,该函数需要一个函数并返回一个具有翻转前两个参数的函数:

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
   where g x y = f y x
Run Code Online (Sandbox Code Playgroud)

我完全不明白是什么fg有。它们是两个不同的功能吗?同样,在where绑定中,究竟是什么g x y = f y x意思?

Jus*_* L. 5

在语法中:

myFunction x = x + 2
Run Code Online (Sandbox Code Playgroud)

等号左侧的事物x被视为“参数”。您可以在等号的右手符号上使用它们来声明您想要的结果是什么。

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

因此,这里有:

flip' f = g
Run Code Online (Sandbox Code Playgroud)

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

我们还有另一个定义:

g x y = f y x
Run Code Online (Sandbox Code Playgroud)

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

所以当我们说:

flip' f = g
  where
    g x y = f y x
Run Code Online (Sandbox Code Playgroud)

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

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

flippity flop = glop
  where
    glop x y = flop y x
Run Code Online (Sandbox Code Playgroud)

查看您是否可以理解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
Run Code Online (Sandbox Code Playgroud)

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


typ*_*ern 5

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

where子句只是在定义什么g。也就是说,定义一个函数,该函数仅将f其参数取反即可调用。

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

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = \x y -> f y x
Run Code Online (Sandbox Code Playgroud)