2016-01-24 43 views
2

我目前正在学习Haskell,而我遇到的不是一个问题,而是一个混乱点。我正在看电子书 “学习你一个哈斯克尔”的例子。 (http://learnyouahaskell.com/higher-order-functions),有一个lambda函数和foldl的例子,我不太明白。 因此,在本例中提供的代码来重新创建反向功能如下:了解Lambda函数和foldl在Haskell中的工作方式

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

我所编制,并成功地运行。不过,我不明白为什么你不需要指定的列表是从像这样来:

​​

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

有人可以解释这一点,或者甚至指向一个解释它的文档吗?谢谢:)

回答

3

它被称为η-reduction:在lambda微积分(因此在哈斯克尔),你可以用代替\x -> f x。再加上一个事实,即函数定义实际上是语法糖:

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) [] 

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

+0

正是我在找的东西,谢谢:) –