関数合成について勉強したこと

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

Haskellの関数適用と関数合成の違いを整理したのでメモしておきます。

関数合成とは

(.)という中置関数を使い2つの関数を結合して新しい関数を作成すること。

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

上記のように、合成後の関数はaとなる引数を1つのみ渡すことが可能。合成する右の関数に2つ以上の引数をとる関数を合成する場合、カリー化して合成することを考える。

例として、mapとreplicateを合成する関数を考える。合成なしで単純に実行した場合...

ghci> map (*2) $ replicate 2 3

replicate 2 3の結果、[3,3]がmap (*2)に渡される。

ダメなパターン

上記を合成して実行する場合、

ghci> map (*2) . replicate 2 3

としたいところだが、(b -> c) -> (a -> b) -> aの定義に一致しないことになる。

カリー化した関数を合成する

よって、replicate 2 3replicate 2としてカリー化して合成しておき、合成関数に3という引数を渡せばよい。

ghci> (map (*2) . replicate 2 ) 2
[4,4]
自分メモ
  • 関数適用($)は関数を実行した値を適用する
  • 関数合成(.)は引数一つをとる関数を合成する

として覚えておく。