我正在从“了解Haskell带来的好处!”中学习高阶函数。由Miran Lipovaca撰写。
对于下面的函数翻转,它接受一个函数并返回一个带有翻转的前两个参数的函数:
flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
where g x y = f y x
我不确定f
和g
是什么。它们是两个不同的功能吗?同样,在where绑定中,g x y = f y x
到底是什么意思?
答案 0 :(得分:5)
使用语法:
myFunction x = x + 2
等号x
左侧的视为“参数”。您可以在等号的右手符号上使用它们,以声明想要的结果。
此语法定义了具有单个参数myFunction
的函数x
。
所以我们有:
flip' f = g
这定义了具有单个参数flip'
的函数f
。
我们还有另一个定义:
g x y = f y x
这定义了一个函数g
,具有两个参数x
和y
。
所以当我们说:
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)
f
是flip'
的输入(要翻转的函数),g
是flip'
的输出(它将返回的翻转函数)。>
where
子句只是定义g
是什么;也就是说,定义一个简单地调用f
并反转其参数的函数。
只需让g
返回一个lambda,就可以避免完全命名flip'
:
flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = \x y -> f y x