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 中缀函数应用优先级的主要内容,如果未能解决你的问题,请参考以下文章