Haskell 中缀函数应用优先级

Posted

技术标签:

【中文标题】Haskell 中缀函数应用优先级【英文标题】:Haskell infix function application precedence 【发布时间】:2011-12-29 15:47:24 【问题描述】:

f x y = x * y。我们可以通过两种方式应用这个函数:f 5 6,或者,使用中缀表示法,5 `f` 6。运算符规则是否适用于最后一个表达式?这个申请有什么优先权?它只是另一种形式的函数应用,所以它也会有最高的优先级吗?

我想编译器看到这种特殊形式(由于`` 和/或以字母(?)开头的名称),实际上将其视为普通函数应用程序,而不是将其视为运算符。

【问题讨论】:

Haskell 98 语法允许您选择优先级,详情请参阅haskell.org/onlinereport/decls.html#fixity。 【参考方案1】:

Haskell 98 Report 有一个关于 Operator Applications 的部分将其清除:

运算符要么是运算符符号,例如 + 或 $$,要么是 用重音符号(反引号)括起来的普通标识符,例如 `操作`。例如,不要写前缀应用程序 op x y, 可以编写中缀应用程序 x `op` y。如果没有固定性声明 为 `op` 给出,然后它默认为最高优先级并离开 关联性(参见第 4.4.2 节)。

正如其他答案所示,报告中还有一个关于Fixity Declarations 的部分,允许您定义自己的固定性,例如:

infixl 7 `op`

【讨论】:

【参考方案2】:

如果没有给出明确的固定性声明,例如

infixl 7 `quot`

反引号中缀函数的默认固定性为infixl 9,因此将被视为具有相同固定性的任何其他中缀运算符。

【讨论】:

为什么默认为infixl 9?这种选择背后有什么原因,还是随意的? 在某种程度上,这当然是任意的。但是由于拥有infix 不允许在没有括号的情况下进行链接,因此具有关联性的方向会更方便。右关联性比较少见,因此infixl 是“最不令人惊讶”的选择。优先级 9 最接近前缀应用优先级,因此与前缀应用相比变化最小。做出决定时我不在场,但我认为选择infixl 9 是因为它最方便且不会引起意外。 我明白了,但是像 !!$ 这样的东西呢。为什么!! 的优先级高于$,有什么理由吗?只是想了解表中所有运算符的位置的原因:haskell.org/onlinereport/decls.html#fixity $ 需要非常低的优先级,因为否则在将函数应用于非原子参数时仍然需要括号,如果 foo $ a + b*c 意味着 (foo a) + (b*c),那将毫无意义。 $ 的目的要求实际上其他所有内容都具有更高的优先级。许多[相对]优先级,*+ 等绑定更紧密,在数学和其他编程语言中很常见。除了先前的约定之外,对于 [预期] 常见情况最方便的考虑因素将起到决定优先级的作用。

以上是关于Haskell 中缀函数应用优先级的主要内容,如果未能解决你的问题,请参考以下文章

Haskell中函数应用运算符的使用

栈应用之中缀表达式计算C#实现

GHC - Haskell 中的中缀声明

中缀表达式实现简单计算器

范畴和函子,以及它们在 Haskell 中的应用——洪峰老师讲创客道(三十四)

学习惯用 Haskell 的资源(eta 缩减、符号中缀运算符、库等)[关闭]