[英]How to interpret Associativity/Precedence in Haskell
我有一个关于关联性和优先级的问题。 是这个代码
msum . map return
相当于这个
(msum . map) return or
或这个?
msum . (map return)
通常应该如何解释 Haskell 中的这种关联性和优先级?
执行摘要: msum. map return == msum. (map return)
msum. map return == msum. (map return)
msum. map return == msum. (map return)
因为并置比任何显式运算符具有更高的优先级。
通常,运算符的结合性和优先级都是使用三个固定性声明之一设置的。
infix
infixl
infixr
每个都采用 0 到 9 之间的优先级和一个运算符。 infixl
创建一个左结合运算符, infixr
创建一个右结合运算符,并infix
一个非结合运算符。 (这意味着你不能在没有显式括号的情况下将这些运算符链接在一起;参见(==)
,因为3 == 5 == 9
是不允许的。)
例如,由于以下声明, 4 * 3 * x ^ 2
解析为(4 * 3) * (x ^ 2)
:
infixl 7 *
infixr 8 ^
乘法是左结合的,因此首先计算4 * 3
,然后 12 乘以x ^ 2
。 它不是(12 * x) ^2
因为^
有更高的优先级。
Function 组合具有最高的可分配优先级(我相信选择使用infixr
而不是infixl
是任意的),定义为
infixr 9 .
但是,您可以将并置视为 function 应用程序的“空”运算符,具有更高的优先级 10,高于任何显式运算符所允许的优先级。 如果在语法上允许,您可以想象 function 应用程序被定义为
infixl 10
的中缀用法.
优先级低于 function 应用程序,因此当您编写msum. map return
msum. map return
, map
“吃掉” return
,结果通过中缀与msum
.
.
如果你申请了,情况就不是这样了.
在 function 样式中: (.) msum map return
无效,因为(.)
"eats" msum
和map
,后者没有机会通过return
。 要解决此问题,您必须使用括号,如下所示: (.) msum (map return)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.