gpt4 book ai didi

Haskell:了解与 lambda 函数一起使用时的映射函数

转载 作者:行者123 更新时间:2023-12-02 16:27:22 25 4
gpt4 key购买 nike

我有以下两个 Haskell 表达式:

map (\f x -> f x 5) [(-),(+),(*)]
map (\f x -> f 5 x) [(-),(+),(*)]

我试图弄清楚上面的表达式是否等价于下面的表达式:

map ($ 5) [(-),(+),(*)]

我试图理解前两个表达式之间的区别。由于对于这两个表达式,只有一个参数传递给 lambda 函数(例如运算符),因此该函数将被部分应用。

第一个表达式的结果列表中的元素是否正确:

(1) - x 5 = (- x) 5

(2) + x 5 = (+ x) 5

(3) * x 5 = (* x) 5

对于第二个表达式:

(1) - 5 x = (- 5) x

(2) + 5 x = (+ 5) x

(3) * 5 x = (* 5) x

但是,我认为这两个表达式都不等同于 map ($ 5) [(-),(+),(*)]。这是因为 (- x) 5(其中 x 是数字)在 GHCI 中给出错误并且是无效表达式。类似地 (- 5) x 也会给出错误。另一方面,map ($5) [(-)] 会产生一个函数,该函数接受一个数字并用 5 减去它。这个推理正确吗?任何见解都值得赞赏。

最佳答案

(- 5) 5 会给出错误,因为前缀减号是语言语法中的特殊情况:(- 5) 表示负五,数字,并且不是减五的函数(另请参见: Currying subtraction )。既然如此,我将重点关注 (+) 案例,该案例并不异常(exception)。

在第二个表达式 map (\f x -> f 5 x) [(-),(+),(*)] 中,结果列表的第二个元素将为:

(\f x -> f 5 x) (+)

当手动评估这样的事情时,一定要小心,不要混淆前缀、中缀和运算符的分段使用。这里的申请给出了...

\x -> (+) 5 x  -- Prefix syntax (note the parentheses around the operator)

...相当于...

\x -> 5 + x  -- Infix syntax

...以及:

\x -> (5 +) x  -- Left section
\x -> (+ x) 5 -- Right section

(5 +) -- Left section, pointfree

因此,这些部分是在运算符的中缀用法之后形成的,相对于您的问题应该是相反的。至于map ($ 5) [(-),(+),(*)],它相当于map (\f x -> f 5 x) [(-), (+),(*)],你的第二个表达式。您可以通过使用 ($) f x = f x 来确定 ($5) 右侧部分是什么来确认这一点。

关于Haskell:了解与 lambda 函数一起使用时的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com