理想未来ってなんやねん

娘可愛い。お父さん頑張る。

Haskell 13日目

Haskell 13日目。
継続は力なり。

本日は関数定義の続きからです。
危うく美味しいスイーツの日記になってしまいそうな勢いでしたが、Haskellも継続していきます。

演算子の優先順位と結合性

二項演算子を使った式は解釈が曖昧になる場合があります。
Haskell処理系は演算子の優先順位(preceedence)と結合性(associativity)を使ってどちらに解釈すべきかを判断します。

例えば次の式では、

1 + 3 * 6

『+』より、『*』の方が優先順位が高いので、1 + (3 * 6)のように解釈されます。
優先順位が高い演算子ほど、その両側の項が先に結合されます。


しかし、2つの演算子の優先順位が同じだった場合、優先順位だけでは式を解釈できません。
そのような場合には結合性を使って式を解釈します。

例えば『15 - 3 - 1』の場合、『(15 - 3) - 1』のように解釈されます。これを左結合(left associative)であると言います。
『x = y = 1』の場合は『x = (y = 1)』と解釈されます。これを右結合(right associative)であると言います。

また、Javaでの『x < y < z』はコンパイルエラーになりますが、このように『x 演算子 y 演算子 z』という形式が言語で認められていない場合、その演算子は非結合(non-associative)であると言います。

Haskellでの演算子の優先順位と結合性

Preludeモジュールで定義されている演算子の優先順位と結合性は次の通りです。

優先順位 左結合 非結合 右結合
9 !! ..
8 ^ ^^ **
7 * / `div` `mod` `rem` `quot`
6 + -
5 : ++
4 == /= < <= > >= `elem` `notElem`
3 &&
2 ¦¦
1 >> >>=
0 $ $! `seq`

ユーザーが独自に定義した演算子は優先順位9の左結合がでデフォルトとなります。

演算子の優先順位と結合性の宣言

Haskellでは独自に定義した二項演算子にも優先順位と結合性を指定できます。

infixl 2 <$$>
infixr 3 |||
infix  4 ==

infixlは左結合、infixrは右結合、infixは非結合を意味しています。
数字は演算子の優先順位を表し、0から9の数値で指定し、数字が大きいほど優先順位が高くなります。

一般に、演算子の優先順位と結合性を指定するには上記のように記述しますが、優先順位は省略可能です。その場合優先順位は9(最高)になります。


今日のところはここまで。