基本的な構文

7.6 関数定義

演算子の優先順位と結合性について

日本語で書くと何だか難しく感じますね。でもプログラミングする際には普通に意識していることでした。
優先度はまぁよいとして、結合性の方。
同じ優先度の演算子が複数ある場合、どの演算子から評価されるのかの規則です。


優先順位に関して、前に作ったサンプルで試してみます。

  • myPlus2.hs
main = do print $ 10 @+--+@ 30
          print $ (@+--+@) 50 50
          print $ 10 @+--+@ 20 @+--+@ 30
          print $ 10 @+--+@ 20 * 30

(@+--+@) :: Int -> Int -> Int
x @+--+@ 0 = x
(@+--+@) x y = x + y
infixl 0 @+--+@


そしてビルドしてみます。

% ghc -W -o myPlus2 myPlus2.hs

myPlus2.hs:1:10:
    Precedence parsing error
        cannot mix `$' [infixr 0] and `@+--+@' [infixl 0] in the same infix expression

myPlus2.hs:3:10:
    Precedence parsing error
        cannot mix `$' [infixr 0] and `@+--+@' [infixl 0] in the same infix expression

myPlus2.hs:4:10:
    Precedence parsing error
        cannot mix `$' [infixr 0] and `@+--+@' [infixl 0] in the same infix expression


あれれ、なんか怒られてしまった。
どうも左結合の優先順位0は指定出来ないみたい。右結合優先度0の$とバッティングするとのこと。
右結合にしたり、優先順位を0以外にすると問題ありませんでした。
ふ〜ん、そんなもんなのかなぁ。
優先度を8にして試してみました。

% ./myPlus2                   
40
100
60
900


優先順位が効いているようです(*よりも優先度が高い)。