演算子

このページでは,Haskell における演算子の扱いを説明します.

標準の演算子

標準で定義されている二項演算子には,次の表に示すようなものがあります.

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

非結合は,結合性に意味が無いことを意味します. 例えば,x > y > z という式は Haskell では無効であり,演算子 > の結合性には意味がありません.

演算子のユーザ定義

演算子には,主に次の文字からなる記号列を使います. これ以外にも,Unicode で記号と定義されている文字も使えます.

!  #  $  %  &  *  +  .  /  <  =  >  ?  @  \  ^  |  -  ~

ただし,以下の記号列は予約されているため,独自に定義できません. また,コロン : で始まる記号列は構成子用に予約されています.

..  :  ::  =  \  |  <-  ->  @  ~  =>

演算子は 2 引数の関数として定義します. 例えば,自前の累乗演算子 ^^^ を定義するには,プログラムは次のように書きます.

(^^^) :: Double -> Int -> Double
_ ^^^ 0 = 1.0
x ^^^ y = x * (x ^^^ (y - 1))

main = print $ 2.0 ^^^ 8  -- 出力: 256.0

中置と前置の切り替え

中置演算子は括弧 () で囲むことにより,一般の関数と同じように扱えます.

(+) 2 3   -- 値: 5
(-) 2 3   -- 値: -1

また,2 引数関数はバッククォート `` で囲むことにより,中置形式で書けます.

5 `div` 2   -- 値: 2
5 `mod` 2   -- 値: 1

セクション

中置演算子の部分適用には,セクション (section) と呼ばれる形式が利用できます. 中置演算子 + のセクションは,次の通りです.

(x +)  -- \y -> x + y に同じ
(+ y)  -- \x -> x + y に同じ

次の式は,map (\x -> 2 * x) [1, 2, 3, 4, 5] と等価な式を,セクションを用いて書いたものです.

map (2 *) [1, 2, 3, 4, 5]  -- 値: [2, 4, 6, 8, 10]

ただし,式 (- x) はセクションとは解釈されず,単項マイナス演算子の適用とみなされます. 前者の意味の式を得るには,(subtract x) または (+ (-x)) と書きます.

結合性宣言

演算子の結合性と優先順位を指定するには,次の宣言を書きます.

結合性 優先順位 演算子

結合性は,infixl(左結合),infixr(右結合),infix(非結合)のいずれかを指定します. 優先順位は 0 から 9(9 が最も強い)までの数字で指定します. 優先順位の数字は省略でき,省略した場合の優先順位は 9 となります.

例えば,演算子 &&(右結合,優先順位 3)の結合性宣言は,次のように書きます.

infixr 3 &&