为什么运算符/函数转换不可逆?

时间:2019-02-28 11:16:50

标签: haskell

在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

1 个答案:

答案 0 :(得分:10)

每次您写(`max`)时,您也可以写max。每次您写`(+)`时,您也可以写+。使运算符或标识符的语法递归地添加会增加解析器的复杂性,而无济于事。

op ::= opSymbol* | `identifier`