繁体   English   中英

如何解释 Haskell 中的关联性/优先级

[英]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 returnmap “吃掉” return ,结果通过中缀与msum . .

如果你申请了,情况就不是这样了. 在 function 样式中: (.) msum map return无效,因为(.) "eats" msummap ,后者没有机会通过return 要解决此问题,您必须使用括号,如下所示: (.) msum (map return)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM