関数適用と関数合成

では、こんな関数があったとき

replicate 2 (product (map (*3) (zipWith max [1,2] [4,5])))

関数合成をして、まっとうな記述をするとこう書けるらしい。

replicate 2 . product . map (*3) $ zipWith max [1,2] [4,5]

Haskell学びたてのころは、どういう発想するとこうなるのか(そしてこの書き方の何が嬉しいのか)あまりわかってなかった。

F#を学んだことによって、

 (replicate 2 << product << map (*3)) <| (zipWith max [1,2] [4,5])

という目で見ることができるようになった。 演算子の記号が違うだけでだいぶ雰囲気が変わるもんだ。

でもやっぱりF#みたいに左から書き、左から読みたいな。

(zipWith max [1,2] [4,5]) |> (map (*3) >> product >> replicate 2)

んで合成関数を再利用しないんだったらもういっそ

zipWith max [1,2] [4,5])
  |> map (*3) 
  |> product 
  |> replicate 2