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

时间:2015-03-02 03:55:27

标签: 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))

即,$可以用括号替换(在$ 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)

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

1 个答案:

答案 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)

因此,$(完全应用时)可以被认为是在表达式的两个侧围绕括号。