操作员解剖
The $
应用程序运算符的形式为:
($) :: (a -> b) -> a -> b
当您想要避免尾随一对括号时,经常会出现这种情况:
func a (b + c)
等于:
func a $ b + c
这背后的魔力可以简单地解释为固定性声明 http://www.haskell.org/haskellwiki/Keywords#infixr:
infixr 0
这意味着:之后的一切$
将被分组为一个实体,就像它们被括在括号中一样。
当然,这也可以像这样“嵌套”:
func a $ b + other $ c - d
意思是:
func a (b + other (c - d))
作为函数的应用程序运算符
你的案例非常有趣,根据我的经验,不经常使用。
我们来分析一下:
map ($ 4) [odd, even]
我们知道map
的类型是:
map :: (a -> b) -> [a] -> [b]
如果有人忘记了,其行为是:采用第一个参数(来自a
to b
)并将其应用到每个a
在第二个参数列表中,最终返回结果列表。
你可以看到($ 4)
作为“将 4 作为参数传递给某事物”。意思就是:
($ 4) func
是相同的:
func $ 4
So:
map ($ 4) [odd, even]
means:
[($ 4) odd, ($ 4) even]
[(odd $ 4), (even $ 4)]
[False, True]
为什么 (func $) 不是必需的
你可以争论,就像你可以做的那样(/ 4)
and (2 /)
分别表示“某物除以 4”和“2 除以某物”,你可以这样做($ 4)
and (func $)
你是对的。
In fact:
(func $) 4
是相同的:
func $ 4
func 4
与以下内容相同:
($ 4) func
但现实是:
map (func $) [...]
是不必要的,因为第一个参数map
始终应用于列表中的每个参数,使上面的内容与以下内容相同:
map func [...]