【问题标题】:Need help understanding (\x -> ) in Haskell需要帮助理解 Haskell 中的 (\x -> )
【发布时间】:2013-04-27 06:08:21
【问题描述】:

在 ZVON 上,为 takeWhile 函数提供的定义之一是

Input: takeWhile (\x -> 6*x < 100) [1..20]

Output: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

有人能解释一下(\x -&gt; 6*x &lt; 100)这部分是什么意思吗?

【问题讨论】:

  • 它在“Learn you a Haskell”(或在文档中?)中说 \ 应该看起来像 lambda 希腊字母:λ。 Here 是 Haskell 关于匿名函数的文档
  • 马里亚诺,你为什么不把你的答案作为答案发布?
  • (\x -&gt; 6*x &lt; 100)((&lt;100).(6*)) 相同。
  • . 是什么意思?
  • (.) f g x = (f .) g x = (. g) f x = (f . g) x = f (g x)。所以((&lt;100).(6*)) x = (&lt;100) ( (6*) x) = (&lt;100) (6*x) = (6*x)&lt;100。爱荷华州,((&lt;100).(6*)) = \x -&gt; (6*x)&lt;100。另见:stackoverflow.com/questions/13139969/…

标签: haskell


【解决方案1】:

这是一个匿名函数定义,也称为 lambda 表达式。 (\x -&gt; 6*x &lt; 100) 是一个函数,它接受一个数字,并返回不等式的布尔结果。

由于像 Haskell 这样的函数式语言经常将函数作为参数,因此可以方便地内联定义简单的函数,而无需为其指定名称。

【讨论】:

    【解决方案2】:

    原来,Alonzo Church 想用circumflex 标记函数表达式中的变量,例如(ŷ.x(yz)) 但当时普林斯顿印刷机无法做到这一点。然后他想至少在变量之前打印carets,像这样:(^y.x(yz)),但他们也不能这样做。

    下一个最佳选择是改用希腊字母 lambda,因此他们最终写成 (λy.x(yz)) 等,因此 lambda-expression 中的“lambda”。这只是一个印刷事故。

    今天在 ASCII 终端上,我们甚至不能使用字母 λ,因此在 Haskell 中我们使用反斜杠(在原始 lambda-expressions notation 中用箭头代替点):

    (\y -> x (y z))
    

    代表一个函数g,这样

    g y = x (y z)
    

    来源:在某处读过,不记得在哪里。

    【讨论】:

      【解决方案3】:

      (\x -&gt; 6*x &lt; 100) 是一个 lambda,它是一个匿名函数,它接受一个参数(这里称为 x)并计算并返回 6*x &lt; 100,即测试该数字乘以 6 是否小于超过 100 个。

      【讨论】:

        【解决方案4】:

        它是一个 lambda 函数,即您在现场定义的一个函数,主要是为了方便。您将其读作“将 x 作为输入,将其乘以 6 并查看它是否小于 100”。不过,还有一些其他相关的便利设施。例如,在 Haskell 中,Lambda 函数和普通函数具有关联的词法环境,并且正确地说是closures,因此它们可以使用环境作为输入来执行计算。

        【讨论】:

        • 如果我们提到如果这是一个命名(顶级)函数,它可能看起来像someFunctionName x = 6*x &lt; 100,这可能会有所帮助。
        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多