如何使用 $ 避免 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)
因此,$
(完全应用时)可以被认为是在表达式的 两边加上括号。
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)
因此,$
(完全应用时)可以被认为是在表达式的 两边加上括号。