2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

関数合成:lengthとshowの場合

Last updated at Posted at 2016-05-07

はじめに

私は現在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

  1. 『ウメハラ』4巻の巻末マンガで、コンボができないという作者に対しウメハラが「そういう時はコンボを分解して練習する」と言っていたのを思い出しました(/・ω・)/

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?