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)
我完全不明白是什么f和g有。它们是两个不同的功能吗?同样,在where绑定中,究竟是什么g x y = f y x意思?
在语法中:
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,带有两个参数x和y。
所以当我们说:
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。
f 是flip'的输入(要翻转的函数),g是flip'的输出(将返回的翻转函数)。
该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)