我在阅读Learn You a Haskell for Great Good时遇到了这个例子。
ghci> map ($ 3) [(4+), (10*), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
我不太明白如何将$
当作函数应用程序。这是否意味着$
是运算符?但是,如果是这样,在示例中它将如何与+
或*
嵌套?我尝试了$ 3 4+
,$ 4 + 3
,但都提出了parse error on input ‘$’
。在函数式编程上下文中如何想到这样的表达式?
答案 0 :(得分:13)
$
确实是一个运算符,定义为:
f $ x = f x
-- or equivalently:
($) f x = f x
您上面的表达式与{{1}的定义)等价于:
map
[($ 3) (4 +), ($ 3) (10 *), ($ 3) sqrt]
和($ 3)
中的括号不是可选的。它们是operator section的一部分。基本上,可以使用四种方式使用中缀运算符(例如(4 +)
):
两个参数之间:
+
仅给出第一个参数:
x + y
仅给出第二个参数:
(x +)
-- like \y -> x + y
没有参数:
(+ y)
-- like \x -> x + y
(+)
-- like \x y -> x + y
等于($ 3) f
等于f $ 3
。
f 3
评估为($ 3) (4 +)
评估为(4 +) $ 3
评估为(4 +) 3
评估为4 + 3
。