在Haskell中,每个运算符都被认为是双参数函数的语法糖(除了一元减号,这是一个词法级异常).
我可以通过将操作符括在括号中将其转换为函数,如下所示:
Prelude> (+) 3 4
7
Run Code Online (Sandbox Code Playgroud)
同样,我可以将一个双参数函数放入一个运算符中,方法是将它包含在后面的标记中:
Prelude> 3 `max` 4
4
Run Code Online (Sandbox Code Playgroud)
那为什么我不能两个都做?
Prelude> (`max`) 3 4
<interactive>:3:7: error: parse error on input ‘)’
Prelude> 3 `(+)` 4
<interactive>:4:4: error: parse error on input ‘(’
Run Code Online (Sandbox Code Playgroud)
第一个是特别令人震惊的,因为以下工作:
Prelude> (`max` 3) 4
4
Run Code Online (Sandbox Code Playgroud)
Li-*_*Xia 10
每次写作(`max`),你也可以写max.每次你写作`(+)`你也可以写+.使运算符或标识符的语法递归增加了解析器的复杂性,没有任何好处.
op ::= opSymbol* | `identifier`
Run Code Online (Sandbox Code Playgroud)