Haskell文档(http://hackage.haskell.org/package/base-4.5.0.0/docs/Prelude.html#v:-36-)声明:
$具有低的,右关联的绑定优先级,所以有时它 允许省略括号;例如:
f $ g $ h x = f (g (h x))
即,$可以用括号替换(在$ after后出现的任何内容周围)。
所以当我在https://stackoverflow.com/a/8275081/645703看到一个例子时,
maximum . map product . groupsOf 5 $ x = (maximum . map product .
groupsOf 5) x
我认为它应该是:(括号是在$ $之后出现的任何东西)
maximum . map product . groupsOf 5 $ x = maximum . map product .
groupsOf 5 (x)
我知道我错了,但我不知道为什么。
答案 0 :(得分:13)
$
采用左侧的任何函数并将其应用于右侧的任何函数。可以定义喜欢这样:
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)
因此,$
(完全应用时)可以被认为是在表达式的两个侧围绕括号。