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

関数合成

演算子(.)

動作

演算子(.)は関数を合成する。f . gは引数にgを適用した結果にfを適用する関数だ。3を足して2倍する関数は

(* 2) . (+ 3)

と書ける。

% ghci
Prelude> ((* 2) . (+ 3)) 8
22

8に3を足して2倍している。

定義

(.) f g x = f (g x)

[関数dotの図]

第3引数xに第2引数である関数gを適用した結果に第1引数であるfを適用する。演算子であることを強調したければ

(f . g) x = f (g x)

あるいは

f . g = \x -> f (g x)

[演算子dotの図]

と書ける。

使い道

RSA暗号の例の関数xxcryptを変形する。

xxcrypt n ed mc = mc ^ ed `mod` n

部分適用と関数合成で

xxcrypt n ed = (`mod` n) . (^ ed)

のように書ける。「ed乗してnの剰余を取る」ということだ。

f . g

を関数的な書きかたにすると

(.) f g

となる。g、fの順に適用するのでgの返り値とfの引数は同じ型だ。gの型をa -> bとしfの型をb -> cとする。結果としてできるf . gはgの引数が引数となりfの返り値が返り値となる。

f :: b -> c
g :: a -> b
f . g :: a -> c

演算子(.)はf, gを引数としf . gを返り値とする。

(.) :: (b -> c) -> (a -> b) -> (a -> c)

まとめ

関数合成演算子(.)を学んだ。「関数gを適用しそれに関数fを適用する」処理をそのまま書ける。

課題

  1. 小文字にして文字コードを求める関数を関数合成によって定義せよ

「関数適用」へもどる 「引数を入れ替える」へ

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