如何使用 $ 避免 Haskell 中的括号

How to use $ for avoiding parenthesis in Haskell

Haskell 文档(http://hackage.haskell.org/package/base-4.5.0.0/docs/Prelude.html#v:-36-)指出:

$ has low, right-associative binding precedence, so it sometimes allows parentheses to be omitted; for example:

 f $ g $ h x  =  f (g (h x))

也就是说,$ 可以用圆括号代替(围绕出现在 $ 之后的任何内容)。

所以当我在 看到一个例子时,

maximum . map product . groupsOf 5 $ x =  (maximum . map product .
groupsOf 5) x

我认为它应该是:(括号围绕出现在 $ 之后的任何内容)

maximum . map product . groupsOf 5 $ x =  maximum . map product .
groupsOf 5 (x)

我知道我错了,但我不知道为什么。

$ 获取左侧的任何函数并将其应用于右侧的任何函数。在可以这么定义喜欢:

expr1 $ expr2 = expr1 expr2

当然,在任何标识符周围加上括号本身不会改变任何东西,所以让我们这样做:

expr1 $ expr2 = (expr1) (expr2)

而且由于 Haskell 是惰性的,我们可以简单地将 $ 的参数代入结果表达式:

f $ g $ h x = (f) (g $ h x) = (f) ((g) (h x))

maximum . map product . groupsOf 5 $ x = (maximum . map product . groupsOf 5) (x)

因此,$(完全应用时)可以被认为是在表达式的 两边加上括号。