我正在从“了解Haskell带来的好处!”中学习高阶函数。由Miran Lipovaca撰写。我知道flip函数接受一个函数并返回一个像原始函数一样的函数,但是前两个参数被翻转。
我不完全了解带有map函数的以下示例的工作方式。
ghci> map (flip subtract 20) [1,2,3,4]
[19,18,17,16]
Map接受一个函数并将其应用于列表的每个元素,从而生成一个新列表。但是由于函数映射是带参数的翻盖subtract 20 [1,2,3,4]
,结果函数是20 subtract [1,2,3,4]
吗?
我认为这是不正确的,因为只有在您键入时才会生成诸如19的值subtract 1 20
。我不确定在上面的示例中减法将如何工作以产生输出列表。
不,这里的功能map :: (a -> b) -> [a] -> [b]
是(flip subtract 20)
,这是您传递给的参数map
。因此,这意味着:
map (flip subtract 20) [1,2,3,4]
等效于:
[flip subtract 20 1, flip subtract 20 2, flip subtract 20 3, flip subtract 20 4]
flip :: (a -> b -> c) -> b -> a -> c
是一个接受一个函数并翻转参数的函数。因此flip subtract 20
在语义上等同于\x -> subtract x 20
。因此,我们的列表等效于:
[subtract 1 20, subtract 2 20, subtract 3 20, subtract 4 20]
subtract :: Num a => a -> a -> a
是的“翻转”版本(-)
,因此等效于:
[20 - 1, 20 - 2, 20 - 3, 20 - 4]
因此等效于:
Prelude> map (flip subtract 20) [1,2,3,4]
[19,18,17,16]
因此,上述表达式的缩写是:
map (20 -) [1,2,3,4]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句