【问题标题】:Lambda in HaskellHaskell 中的 Lambda
【发布时间】:2020-03-05 16:02:23
【问题描述】:

有人可以向我解释一下 lambda 在 Haskell 中的工作原理吗?

例如。 add' = \x -> (\y -> x+y)foldl (\x _ -> x+1) 0 [1,2,3] == 3

我知道结果是什么,函数做了什么,但我不明白为什么我们需要 lambda 表达式或者 lambda 在函数中做了什么?

非常感谢

【问题讨论】:

  • 你不需要 lambda,因为你可以定义一个函数。它只是一种编写短函数的方法。 \x -> ... 部分定义了一个将x 映射到... 的函数。但是在您的示例中,您可以定义 add' = (+)foldl (+1) 0 [1,2,3],因此您本身不需要使用 lambda 表达式。

标签: haskell


【解决方案1】:

从某种意义上说,lambda 表达式是从头开始定义函数的方式。

你可以写

add' x y = x + y

但那是为了

add' x = \y -> x + y

它本身对

add' = \x -> \y -> x + y

对于foldl (\x _ -> x + 1) 0 [1,2,3],您需要提供一个函数作为第一个参数。一个 lambda 表达式是一种方便的方式来做到这一点,而不必为它想出一个其他未使用的名称。例如,

foldl someFoldFunc 0 [1, 2, 3]
    where someFoldFunc x _ = x + 1

虽然也可以使用其他函数来构造函数,而不是从头开始构建它。

foldl (const . (+1)) 0 [1, 2, 3]

大多数人会认为这比显式 lambda 表达式或命名函数的可读性差。

【讨论】:

    【解决方案2】:

    你必须明白定义一个 lambda 函数只是表达一个没有名字的函数的一种方式。 Lambda 存在于许多语言中,例如 f.i. Haskell 和 JavaScript。然而,与许多其他语言不同的是,在包括 Lambda 在内的 Haskell 中,所有函数都默认以柯里化的方式出现。在另一种意义上,你可能总是部分应用它们。

    什么是部分应用..?如果一个函数要求 4 个参数,而您只提供 2 个,那么您得到的结果是另一个函数需要剩余的 2 个参数。因此,当一个函数被部分应用时,它会返回一个新函数,该函数接受剩余的参数,直到所需的参数全部耗尽后返回最终结果。

    这种奇特的行为会产生大量的嘲弄,称为 Lambda 演算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2013-06-06
      • 2014-04-08
      • 1970-01-01
      • 2019-07-24
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多