在Haskell中,每个运算符都被视为具有两个参数的函数的语法糖(一元减号除外,这是一个词法级异常)。
我可以通过将运算符括在方括号中来将其转换为函数,如下所示:
Prelude> (+) 3 4
7
同样,我可以通过将两个参数的函数括在反引号中来使其成为运算符:
Prelude> 3 `max` 4
4
那我为什么不能两者都做?
Prelude> (`max`) 3 4
<interactive>:3:7: error: parse error on input ‘)’
Prelude> 3 `(+)` 4
<interactive>:4:4: error: parse error on input ‘(’
第一个特别糟糕,因为以下内容确实有效:
Prelude> (`max` 3) 4
4
答案 0 :(得分:10)
每次您写(`max`)
时,您也可以写max
。每次您写`(+)`
时,您也可以写+
。使运算符或标识符的语法递归地添加会增加解析器的复杂性,而无济于事。
op ::= opSymbol* | `identifier`