はじめに
私は現在Haskell勉強中なのですが、備忘録&理解を深めるために書いてみたものです。
例文
『関数プログラミング実践入門』には関数合成の例として、以下のような例文が載っています。
Prelude> let digits :: Int -> Int; digits = length . show
Prelude> :t digits
digits :: int -> Int
Prelude> digits 9
1
Prelude> digits 10
2
Prelude> digits 100
3
Prelude> digits 12345
5
このdigitsという合成関数は非負10進整数の桁数を求めるもので、計算過程は以下のようになっています。
digits 12345
=> (length . show) 12345
=> length (show 12345)
=> length "12345"
=> 5
では・・・
では、show . lengthというように合成してみるとどうなるんだろう……。
気になったので試してみました。
Prelude> let hoge = show . length
Prelude> hoge "12345" -- 色々引数を試した結果これがうまく入った
"5"
文字列の"5"が返ってきました。やっていることはなんとなくわかりそうですが、ちゃんと分解してみます。
hoge "12345"
=> (show . length) "12345"
=> show (length "12345")
=> show 5
=> "5"
なるほど、リストの要素数を文字列で返す関数ができあがったのですね。
ということは、hogeに渡してあげる引数は、文字列じゃなくてもよさそう。
Prelude> hoge [1..10]
"10"
一つ一つ分解していくことで、合成関数の理解が少し深まったような気がします。1