演算子

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

標準の演算子

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 &&