为什么操作员/功能转换不可逆?

Pau*_*son 3 haskell

在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)

  • 还要注意它是``(`标识符`)``而不是``(`expression`)``.后者可能导致一些奇怪的情况需要解析,因为表达式可能涉及反引号,例如``(``\ xy - > x`max`y`b)``. (5认同)
  • @chi ...这就是为什么我有时希望它们有一个正确的"开放式和近距离式"版本.目前,字符对backtick-open-paren和close-paren-backtick是无效的语法,所以你可以使它们有效而不破坏向后兼容性,并且有时能够使表达式简单地作为中缀是很好的. (3认同)