top page > computer > haskell > web_lecture > for_programmer > operator.html
更新日:
文責: 重城良国

演算子

演算子とは

演算子は2引数関数だ。

[演算子の図]

中置記法であり演算子の前後の値が第1、第2引数となる。

演算子は関数だ

演算子と関数は表記だけが違う。3 + 8は関数(+)に3と8を与えるのと同じだ。

% ghci
Prelude> 3 + 8
11
Prelude> (+) 3 8
11

[演算子は関数であるの図]

丸括弧で演算子は関数になる。

関数は演算子だ

剰余を計算する関数modはふつうの関数だ。

Prelude> mod 15 4
3
Prelude> 15 `mod` 4
3
[関数は演算子であるの図]

バッククォートで関数は演算子になる。

演算子の部分適用

演算子は左側(第1引数)でも右側(第2引数)でも部分適用できる。

Prelude> (3 +) 8
11
Prelude> (+ 8) 3
11

(3 +)は(+)の第1引数に値3を与えたものだ。引数を3に足す。(+ 8)は(+)の第2引数に値8を与えたものだ。引数に8を足す。

部分適用によって作られた関数に名前をつけてみよう。

Prelude> let addTo3 = (3 +)
Prelude> addTo3 8
11
Prelude> let add8 = (+ 8)
Prelude> add8 3
11

演算子化した関数への部分適用

Prelude> (`mod` 4) 15
3
Prelude> (15 `mod`) 4
3

第2引数を部分適用するには演算子化して部分適用する。

演算子の定義

演算子の定義は関数定義と同じようにする。

(+++) a b = ...

中置記法も使える。

a +++ b = ...

演算子に使える記号

アスキー記号の範囲で

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

が使える。:ではじまる記号列は別の用途で使われるためふつうの演算子としては使えない。

コードの短縮

コードゴルフという遊びがある。与えられたお題でできるだけ短いコードを書く。長い関数に短い別名をつけるという方法がある。

f x y=someLongFunction x+someLongFunction y

43文字だ。これを

l=someLongFunction
f x y=l x+l y

のようにすると改行をいれて32文字だ。11文字短くなる。減らせる文字数は関数の長さと使われている回数から計算できる。

関数名の長さをlenとし使われている回数をtmsとする。1文字の別名に置き換えて減らせる文字数は(len - 1) * tmsだ。別名をつけるために改行も含めて(len + 3)文字使う。全体として減らせる文字数は

(len - 1) * tms - (len + 3)

となる。演算子の名前を考える。この演算は掛け算に似ている。「減らす」イメージを加味して\*\とする。

golf.hs

len \*\ tms = (len - 1) * tms - (len + 3)

関数名someLongFunctionは16文字で2回使われている。

ghci golf.hs
*Main> 16 \*\ 2
11
*Main> 3 \*\ 3
0
*Main> 3 \*\ 2
-2

3文字の関数が3回のとき文字数は変わらない。3文字の関数が2回のときはむしろ2文字増える。

関数の演算子的な定義

関数も演算子的に定義できる。関数定義

op a b = ...

a `op` b = ...

と書ける。

まとめ

演算子は記号から成る識別子で中置記法で書ける2引数関数だ。演算子と関数は()と``で互いに変換できる。定義でも中置記法が使える。

課題

  1. もとの価格と税率から税込み価格を返す演算子/+/を定義せよ

「高階関数」へもどる 「Bool値」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics