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

Mat*_*son 1 haskell

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

$具有低的,右关联的绑定优先级,因此它有时允许省略括号; 例如:

 f $ g $ h x  =  f (g (h x))
Run Code Online (Sandbox Code Playgroud)

也就是说,$可以用括号代替(在$ after后出现的任何内容周围).

所以当我在/sf/answers/579255701/上看到一个例子时,

maximum . map product . groupsOf 5 $ x =  (maximum . map product .
groupsOf 5) x
Run Code Online (Sandbox Code Playgroud)

我认为它应该是:(括号是在$ $之后出现的任何东西)

maximum . map product . groupsOf 5 $ x =  maximum . map product .
groupsOf 5 (x)
Run Code Online (Sandbox Code Playgroud)

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

DJG*_*DJG 13

$采用左边的任何函数并将其应用于右边的任何函数.在可以定义喜欢如此:

expr1 $ expr2 = expr1 expr2
Run Code Online (Sandbox Code Playgroud)

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

expr1 $ expr2 = (expr1) (expr2)
Run Code Online (Sandbox Code Playgroud)

由于Haskell是惰性的,我们可以简单地将参数替换$为结果表达式:

f $ g $ h x = (f) (g $ h x) = (f) ((g) (h x))
Run Code Online (Sandbox Code Playgroud)

要么

maximum . map product . groupsOf 5 $ x = (maximum . map product . groupsOf 5) (x)
Run Code Online (Sandbox Code Playgroud)

因此,$(当充分的应用)可以被看作是把括号围绕这两个表达的两侧.