函数“$
”称为function application operator,定义如下:
($) :: (a -> b) -> a -> b
f $ x = f x
与函数调用不同的是,函数调用具有高优先级,而“$
”具有最低优先级。
函数调用具有左结合性,而“$
”具有右结合性。
f a b c = ((f a) b) c
f $ g $ h $ x = f $ (g $ (h $ x))
使用“$
”可以减少括号。
例如:
sum (map sqrt [1..130]) = sum $ map sqrt [1..130]
sqrt (3 + 4 + 9) = sqrt $ 3 + 4 + 9
sum (filter (> 10) (map (* 2) [2..10])) = sum $ filter (> 10) $ map (* 2) [2..10]
我们可以等价的认为,把“$
”替换成一个左括号,然后在表达式的最有表加上一个右括号。
除了可以减少括号,“$
”还可以把函数调用当做一个函数来对待。
($ 3) :: (Int -> b) -> b
它是一个函数,接受一个函数作为参数,返回这个参数函数作用到3的结果。
> map ($ 3) [(4 +), (10 *), (^ 2), sqrt]
[7.0, 30.0, 9.0, 1.7320508075688772]
网友评论