基本的な構文
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
優先順位が効いているようです(*よりも優先度が高い)。