Haskell:理解与映射函数一起使用时的函数应用运算符

cen*_*980 3 haskell functional-programming higher-order-functions

我有以下 Haskell 表达式:

map ($ 5) [(-),(+),(*)]
Run Code Online (Sandbox Code Playgroud)

我知道函数应用运算符 ($) 将函数应用于给定参数。然而,由于(-)、(+)和(*)函数采用两个参数,因此通过map将这些函数应用到5,这些函数被部分应用。

结果列表将包含三个带有另一个参数的函数:

(1) 从5中减去参数

(2) 将参数加到5

(3) 将参数乘以5

然而,上面的表达式等价于下面的表达式是否有效?

[(5 -),(5 +),(5 *)]
Run Code Online (Sandbox Code Playgroud)

我认为这是正确的,因为我在GHCI中检查了(5 -)、(5 +)和(5 *)的类型,它们都是接受数字并返回数字的函数:

(5 -) :: Num a => a -> a
(5 +) :: Num a => a -> a
(5 *) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

任何见解表示赞赏。

typ*_*ern 5

正确的; 您还可以通过以下方式再次应用运算符:

map ($4) $ map ($ 5) [(-),(+),(*)]
Run Code Online (Sandbox Code Playgroud)

生产[5-4, 5 + 4, 5 * 4]

此外,您可以在运算符右侧指定参数,得到相同的结果:

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

Run Code Online (Sandbox Code Playgroud)

(之所以(-) 5有“-”括号,是为了防止编译器认为您的意思是“负五”,负数,通常的解释(- 5))。