Haskell - lambda 表达式

Posted

技术标签:

【中文标题】Haskell - lambda 表达式【英文标题】:Haskell - lambda expression 【发布时间】:2014-04-08 20:24:07 【问题描述】:

我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式。 我不太了解使用 lambda 表达式相对于定义函数的约定方式的优势。 例如,我通常会这样做:

let add x y = x+y

我可以简单地调用

add 5 6

得到 11 的结果 我知道我还可以执行以下操作:

let add = \x->(\y-> x+y)

并得到相同的结果。 但是就像我之前提到的,我不明白使用 lambda 表达式的目的。 此外,我在前奏中输入了以下代码(一个无名函数?),它给了我一条错误消息。

let \x -> (\y->x+y)

parse error (possibly incorrect indentation or mismatched backets)

提前谢谢你!

【问题讨论】:

至于let \x -> (\y->x+y) 语句-let 语句用于给事物命名。该语句最简单的形式类似于let name = expression。从那时起,您每次想要引用expression 时都使用name。在您的示例中,\x -> (\y->x+y) 是一个表达式(函数类型的值)。所以,你的整个声明的形式是let expression,没有名字绑定。这样没有意义。让表达什么? 【参考方案1】:

许多 Haskell 函数是“高阶函数”,即它们期望其他函数作为参数。通常,我们想要传递给这样一个高阶函数的函数在程序中只在那个特定点使用一次。使用 lambda 表达式比为此定义一个新的本地函数更方便。

这是一个从给定列表中过滤所有大于 10 的偶数的示例:

ghci> filter (\ x -> even x && x > 10) [1..20]
[12,14,16,18,20]

这是另一个遍历列表并为每个元素 x 计算术语 x^2 + x 的示例:

ghci> map (\ x -> x^2 + x) [1..10]
[2,6,12,20,30,42,56,72,90,110]

【讨论】:

有道理!谢谢! 使用描述性名称然后在where 中定义不是更好吗? filter myCompare [1..20]map myTraverse [1..10].

以上是关于Haskell - lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Lambda表达式

如何在横函数中添加lambda表达式?

为啥 java lambda 表达式没有引入新的范围?

Idris——类似Haskell的纯函数编程语言

函数式编程那些事儿

使用 GHC API 评估 Haskell 语句/表达式