让f x y = x * y
. 我们可以通过两种方式应用这个函数:f 5 6
,或者,使用中缀符号,5 `f` 6
。运算符规则是否适用于最后一个表达式?这个申请有什么优先权?它只是另一种形式的函数应用,所以它也会有最高优先级吗?
我想编译器看到这种特殊形式(由于``
和/或以字母(?)开头的名称),实际上将其视为普通函数应用程序,而不是将其视为运算符。
让f x y = x * y
. 我们可以通过两种方式应用这个函数:f 5 6
,或者,使用中缀符号,5 `f` 6
。运算符规则是否适用于最后一个表达式?这个申请有什么优先权?它只是另一种形式的函数应用,所以它也会有最高优先级吗?
我想编译器看到这种特殊形式(由于``
和/或以字母(?)开头的名称),实际上将其视为普通函数应用程序,而不是将其视为运算符。
Haskell 98 报告中有一个关于Operator Applications的部分进行了清理:
运算符要么是运算符符号,例如 + 或 $$,要么是包含在重音符号(反引号)中的普通标识符,例如 `op`。例如,可以不写前缀 application op xy,而是写中缀 application x `op` y。如果没有为 `op` 给出固定性声明,那么它默认为最高优先级和左关联性(参见第 4.4.2 节)。
如其他答案所示,报告还有一个关于固定性声明的部分,允许您定义自己的固定性,例如:
infixl 7 `op`
如果没有给出明确的固定性声明,例如
infixl 7 `quot`
带反引号的中缀函数的默认固定性为infixl 9
,因此将被视为具有相同固定性的任何其他中缀运算符。