了解Lambda函数和foldl如何在Haskell中工作

时间:2016-01-24 23:16:14

标签: haskell lambda

我目前正在学习Haskell,我遇到的问题不是一个问题,而是一个混乱的问题。我正在查看电子书中的例子 "了解Haskell"。 (http://learnyouahaskell.com/higher-order-functions)并且有一个lambda函数和foldl的例子,我不太明白。 因此,在示例中,为重新创建反向函数而提供的代码如下:

I understand, transfer this repository

我已编译并成功运行。但是,我不明白为什么你不需要指定列表的来源,如下所示:

reverse' :: [a] -> [a]  
reverse' = foldl (\acc x -> x : acc) [] 

(其中e将是用户输入的列表[a])。

有人可以解释一下,甚至可以指出一个解释它的文件吗?谢谢:))

1 个答案:

答案 0 :(得分:3)

它被称为η-reduction:在lambda演算中(因此在Haskell中),你可以用\x -> f x替换f。将其与函数定义实际上是语法糖的事实相结合:

g x = f x

是糖的

g = \x -> f x

所以它只是

g = f

应用于您的示例,

reverse' e = foldl (\acc x -> x : acc) [] e
⇌
reverse' = \e -> foldl (\acc x -> x : acc) [] e
⇌
reverse' = foldl (\acc x -> x : acc) []

这种省略仅传递给其他函数的函数参数的想法称为point-free style。它经常在Haskell中使用,可以使您的代码更简洁,并且有时会显示更一般的数学结构。然而,它也可能使你的代码有点神秘(贬义词:毫无意义的风格)。