我目前正在学习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])。
有人可以解释一下,甚至可以指出一个解释它的文件吗?谢谢:))
答案 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中使用,可以使您的代码更简洁,并且有时会显示更一般的数学结构。然而,它也可能使你的代码有点神秘(贬义词:毫无意义的风格)。