演算子
このページでは,Haskell における演算子の扱いを説明します.
1. 標準の演算子
標準で定義されている二項演算子には,次の表に示すようなものがあります.
優先順位 | 結合性 | 演算子 |
---|---|---|
9 | 左結合 | !! |
右結合 | . | |
8 | 右結合 | ^ ^^ ** |
7 | 左結合 | * / `div` `mod` `rem` `quot` |
6 | 左結合 | + - |
5 | 右結合 | : ++ |
4 | 非結合 | == /= < <= > >= `elem` `notElem` |
3 | 右結合 | && |
2 | 右結合 | || |
1 | 左結合 | >> >>= |
0 | 右結合 | $ $! `seq` |
非結合は,結合性に意味が無いことを意味します.
例えば,x > y > z
という式は Haskell では無効であり,演算子 >
の結合性には意味がありません.
2. 演算子のユーザ定義
演算子には,主に次の文字からなる記号列を使います. これ以外にも,Unicode で記号と定義されている文字も使えます.
! # $ % & * + . / < = > ? @ \ ^ | - ~
ただし,以下の記号列は予約されているため,独自に定義できません.
また,コロン :
で始まる記号列は構成子用に予約されています.
.. : :: = \ | <- -> @ ~ =>
演算子は 2 引数の関数として定義します.
例えば,自前の累乗演算子 ^^^
を定義するには次のように書きます.
(^^^) :: Double -> Int -> Double
_ ^^^ 0 = 1.0
x ^^^ y = x * (x ^^^ (y - 1))
main = print $ 2.0 ^^^ 8 -- 出力: 256.0
3. 中置と前置の切り替え
中置演算子は,括弧 (
… )
で囲むことにより,一般の関数と同じように扱えます.
(+) 2 3 -- 値: 5
(-) 2 3 -- 値: -1
また,2 引数関数は,バッククォート `
… `
で囲むことにより,中置形式で扱えます.
5 `div` 2 -- 値: 2
5 `mod` 2 -- 値: 1
4. セクション
中置演算子の部分適用には,セクション(section)と呼ばれる記法が利用できます.
中置演算子 +
のセクションには,次の 2 つがあります.
(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))
と書きます.
5. 結合性宣言
演算子の結合性と優先順位を指定するには,次の宣言を書きます.
結合性 優先順位 演算子
結合性は,infixl
(左結合),infixr
(右結合),infix
(非結合)のいずれかを指定します.
優先順位は 0 から 9(9 が最も強い)までの数字で指定します.
優先順位の数字は省略でき,省略した場合の優先順位は 9 となります.
例えば,演算子 &&
(右結合,優先順位 3)の結合性宣言は,次のように書きます.
infixr 3 &&