Haskell:理解与lambda函数一起使用时的map函数

Haskell:理解与lambda函数一起使用时的map函数,haskell,functional-programming,higher-order-functions,Haskell,Functional Programming,Higher Order Functions,我有以下两个Haskell表达式: map (\f x -> f x 5) [(-),(+),(*)] map (\f x -> f 5 x) [(-),(+),(*)] 我想弄清楚上面的表达式是否与下面的表达式等价: map ($ 5) [(-),(+),(*)] 我试图理解前两个表达之间的区别。 由于对于这两个表达式,只有一个参数传递给lambda函数(例如运算符),因此函数将部分应用 第一个表达式的结果列表中的元素是: (1) -x5=(-x)5 (2) +x5=(+x)5

我有以下两个Haskell表达式:

map (\f x -> f x 5) [(-),(+),(*)]
map (\f x -> f 5 x) [(-),(+),(*)]
我想弄清楚上面的表达式是否与下面的表达式等价:

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

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

(1)
-x5=(-x)5

(2)
+x5=(+x)5

(3)
*x5=(*x)5

对于第二个表达式:

map ($ 5) [(-),(+),(*)]
(1)
-5x=-5x

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

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

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

(-5)5
给出了一个错误,因为前缀减号在语言语法中是一个特例:
(-5)
表示减号五,而不是减号五的函数(另请参见:)。既然如此,我将重点讨论
(+)
案例,这并不例外

在第二个表达式中,
map(\fx->f5x)[(-),(+),(*)]
,结果列表的第二个元素将是:

(\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(\fx->f5x)[(-),(+),(*)]
,您的第二个表达式。您可以通过使用
($)fx=fx这一事实来确定
($5)
右侧部分是什么。

那么(-)5x将等同于5-x,因为它被视为中缀操作符?是的,这就是想法。您可以在前缀语法中使用任何运算符,方法是将其用括号括起来。