Haskell中缀函数应用优先级

31

假设我们有函数 f x y = x * y。我们可以通过两种方式应用这个函数: f 5 6 或者使用中缀符号,5 `f` 6。这种表达式也适用于操作符规则吗?这种应用的优先级是什么?它只是另一种形式的函数应用,所以它是否也具有最高的优先级?

我认为编译器会将这种特殊形式(由于 `` 或名称以字母开头)视为普通的函数应用,而不是将其视为操作符。


2
Haskell 98语法允许您选择优先级水平,请参见http://www.haskell.org/onlinereport/decls.html#fixity获取详细信息。 - Chris Kuklewicz
2个回答

30

Haskell 98报告有一个关于运算符应用的部分解释:

运算符可以是运算符符号,如+或$$,也可以是用反引号(重音符号)括起来的普通标识符,例如 `op`。例如,不必写成前缀应用op x y,而是可以写成中缀应用x `op` y。如果对于 `op` 没有给出结合性声明,则默认为最高优先级和左结合(请参见第4.4.2节)。

正如其他答案所指出的那样,该报告还有一个关于固定性声明的部分,允许您定义自己的运算符固定性,例如:

infixl 7 `op`

12
如果没有给出明确的固定声明,例如
infixl 7 `quot`

使用反引号括起来的中缀函数默认结合性为infixl 9,因此将像具有相同结合性的任何其他中缀运算符一样进行处理。


它为什么默认为infixl 9?这个选择背后是否有任何原因,还是纯属任意的? - CMCDragonkai
1
在某种程度上,这当然是任意的。但由于将其设为“中缀”不允许在没有括号的情况下进行链接,因此具有结合性的方向更加方便。右结合性更为罕见,因此“infixl”是“最不令人惊讶”的选择。优先级9最接近前缀应用程序优先级,因此与前缀应用程序相比,变化最小。我不知道当时做出这个决定的原因,但我认为选择“infixl 9”的想法是它最方便且最不令人惊讶。 - Daniel Fischer
我明白了,但是像 !!$ 这样的东西呢?有没有给出为什么 !! 的优先级比 $ 高的原因?只是想理解表格中所有运算符放置的原因:https://www.haskell.org/onlinereport/decls.html#fixity - CMCDragonkai
5
$ 需要一个非常低的优先级,否则当将一个函数应用于一个非原子参数时,您仍需要括号,如果 foo $ a + b*c 意味着 (foo a) + (b*c),那么它就会变得毫无意义。 $ 的目的要求几乎所有其他运算符都具有更高的优先级。很多[相对]优先级,如 *+ 更紧密等,在数学和其他编程语言中都很常见。除了既定惯例外,还考虑到对于[预期的]常见情况最方便的考虑,这些因素决定了优先级。 - Daniel Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接