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 3
はreplicate 2
としてカリー化して合成しておき、合成関数に3
という引数を渡せばよい。
ghci> (map (*2) . replicate 2 ) 2 [4,4]
自分メモ
- 関数適用($)は関数を実行した値を適用する
- 関数合成(.)は引数一つをとる関数を合成する
として覚えておく。
リンク