Haskell 通过 'map' 中的 '$x' 将参数应用到 inflix 运算符函数列表。它是如何工作的?

Haskell argument application through '$x' in 'map' to a list of inflix operator functions. How does it work?

我只是想知道,出于对它如何运作的好奇,下面的中间表达式是否来自某种优化?我明白 $ 实际上是一个函数,它只提供一个参数。不知何故,通过将此函数应用于 'map' 提供的列表中的函数,它设法看到“$”函数恰好缺少一个函数,正如我提到的那样,它是由 'map' 提供的。这种优化行为是带有“$”的功能应用程序所独有的吗?因为,就其价值而言,我无法从 'map' 和 '$' 的函数定义中看出它是如何得出的,为了方便起见,我在下面提供了这些定义。

从一开始,'$3' 似乎应该出现在函数表达式之前,但这样的表达式不会在编译器中求值。这是优化的扩展中间表达式,似乎正在发生:

[(4+) , (10*) , (^2) , sqrt ]

定义 - $

($) :: (a -> b) -> a -> b  
f $ x = f x

定义-地图

map :: (a -> b) -> [a] -> [b]  
map _ [] = []  
map f (x:xs) = f x : map f xs  

使用的例子

map ($ 3) [(4+), (10*), (^2), sqrt]

返回结果

[7.0,30.0,9.0,1.7320508075688772]

如果我没有正确理解你的问题,你想知道如果你写 ($ 3)?

会发生什么

Haskell语法有一个概念叫做“Section of an infix operator”。这意味着如果你写一个带运算符的表达式(这里是+),那么:

(2 +) == \x -> 2 + x == (+) 2
(+ 2) == \x -> x + 2 == flip (+) 2

Haskell 是一种 函数式 编程语言。函数式编程语言的一个方面是您可以将函数作为参数。这不仅限于函数式编程语言:在 Java、C#、C++ 等中,您可以将 function/method 引用传递给 functions/methods,例如使用参数调用这些函数。

所以你写了:

map (\x -> ($) x 3) [(4+), (10*), (^2), sqrt]

\x -> ($) x 3只是一个普通的函数。因此,如果我们将其应用于第一个参数,我们将得到:

(\x -> ($) x 3) (4+)
-> ($) (4+) 3
-> (4+) 3
-> 4 + 3
-> 7

所以 ($ 3) 的情况没有什么特别之处,它适用于我们只填写运算符右侧的任何运算符。

事实上,您也已经在 (^2) 中使用了这个概念。您的列表实际上如下所示:

map (flip ($) 3) [(+) 4, (*) 10, flip (^) 2, sqrt]

因此您在列表的元素中使用了分段 - 左侧和右侧。