操作员解剖
$
应用程序运算符的形式为:
($) :: (a -> b) -> a -> b
当您想避免使用尾随括号时,通常会出现这种情况:
func a (b + c)
等于:
func a $ b + c
这背后的魔力在其固定性声明中得到了简单的解释:
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
所以:
map ($ 4) [odd, even]
方法:
[($ 4) odd, ($ 4) even]
[(odd $ 4), (even $ 4)]
[False, True]
为什么 (func $) 不是必需的
您可以争辩说,就像您可以做的那样(/ 4)
,(2 /)
分别表示“将某物除以 4”和“将 2 除以某物”,您可以这样做($ 4)
,(func $)
而且您是对的。
实际上:
(func $) 4
是相同的:
func $ 4
func 4
这与以下内容相同:
($ 4) func
但现实是:
map (func $) [...]
将是不必要的,因为第一个参数map
总是应用于列表的每个参数,使上述相同:
map func [...]