假设我们有函数 f x y = x * y
。我们可以通过两种方式应用这个函数: f 5 6
或者使用中缀符号,5 `f` 6
。这种表达式也适用于操作符规则吗?这种应用的优先级是什么?它只是另一种形式的函数应用,所以它是否也具有最高的优先级?
我认为编译器会将这种特殊形式(由于 ``
或名称以字母开头)视为普通的函数应用,而不是将其视为操作符。
假设我们有函数 f x y = x * y
。我们可以通过两种方式应用这个函数: f 5 6
或者使用中缀符号,5 `f` 6
。这种表达式也适用于操作符规则吗?这种应用的优先级是什么?它只是另一种形式的函数应用,所以它是否也具有最高的优先级?
我认为编译器会将这种特殊形式(由于 ``
或名称以字母开头)视为普通的函数应用,而不是将其视为操作符。
Haskell 98报告有一个关于运算符应用的部分解释:
运算符可以是运算符符号,如+或$$,也可以是用反引号(重音符号)括起来的普通标识符,例如 `op`。例如,不必写成前缀应用op x y,而是可以写成中缀应用x `op` y。如果对于 `op` 没有给出结合性声明,则默认为最高优先级和左结合(请参见第4.4.2节)。
正如其他答案所指出的那样,该报告还有一个关于固定性声明的部分,允许您定义自己的运算符固定性,例如:
infixl 7 `op`
infixl 7 `quot`
使用反引号括起来的中缀函数默认结合性为infixl 9
,因此将像具有相同结合性的任何其他中缀运算符一样进行处理。
!!
和 $
这样的东西呢?有没有给出为什么 !!
的优先级比 $
高的原因?只是想理解表格中所有运算符放置的原因:https://www.haskell.org/onlinereport/decls.html#fixity - CMCDragonkai$
需要一个非常低的优先级,否则当将一个函数应用于一个非原子参数时,您仍需要括号,如果 foo $ a + b*c
意味着 (foo a) + (b*c)
,那么它就会变得毫无意义。 $
的目的要求几乎所有其他运算符都具有更高的优先级。很多[相对]优先级,如 *
比 +
更紧密等,在数学和其他编程语言中都很常见。除了既定惯例外,还考虑到对于[预期的]常见情况最方便的考虑,这些因素决定了优先级。 - Daniel Fischer