如果我们有一个表达式:
a $ b @ c
$
是左结合运算符,@
是右结合运算符。它们具有相同的优先级。
这个表达式是如何解析的?作为(a $ b) @ c
还是作为a $ (b @ c)
?
如果我们有一个表达式:
a $ b @ c
$
是左结合运算符,@
是右结合运算符。它们具有相同的优先级。
这个表达式是如何解析的?作为(a $ b) @ c
还是作为a $ (b @ c)
?
这是一个很好的问题。尽管 Dipstick 是正确的,在许多语言中,定义了运算符优先级和关联性以避免此类问题,但在某些语言中可能会出现这种情况。
Haskell 就是这样一种语言。它允许您定义自己的中缀运算符,以及它们的优先级(从 0 到 9 的整数)和关联性(左、右、非)。为您描述的场景创建先决条件很容易:
infixl 5 $$
($$) :: Int -> Int -> Int
a $$ b = a + b
infixr 5 @@
(@@) :: Int -> Int -> Int
a @@ b = a * b
然后是情况本身:
uhoh = 1 $$ 2 @@ 3
这会导致此错误消息:
Precedence parsing error
cannot mix `$$' [infixl 5] and `@@' [infixr 5] in the same infix expression
当然,Haskell 的解决方案——解析错误中止——并不是处理这个问题的唯一方法,但它肯定是一个合理的方法。
有关 Haskell 中运算符解析的更多信息,请参阅Haskell 报告的第 4.4.2 节。
具有相同优先级的运算符要么都是右结合的,要么都是左结合的,因此不会出现问题。