式がある場合:
a $ b @ c
$
は左結合演算子、@
右結合演算子です。優先順位は同じです。
この式はどのように解析されますか? (a $ b) @ c
またはとしてa $ (b @ c)
?
式がある場合:
a $ b @ c
$
は左結合演算子、@
右結合演算子です。優先順位は同じです。
この式はどのように解析されますか? (a $ b) @ c
またはとしてa $ (b @ c)
?
これは素晴らしい質問です。多くの言語では、このような問題を回避するために演算子の優先順位と結合性が定義されているというディップスティックは正しいですが、そのような状況が発生する言語もあります。
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 を参照してください。
同じ優先順位の演算子は、すべて右結合またはすべて左結合であるため、問題は発生しません。