関数適用と関数合成

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

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

Poor Mans' Type Classes

.NETのCLRに高階ジェネリクス(型クラス、高カインド)を!という要望はMSから断られているわけだけども

回答にある「Steffenがコメント欄に書いたようなやり方でエンコードできるよ」というのが気になった。

時間を見つけてこのコードを勉強してやろう。

(おまけ) https://code.google.com/p/fsharp-typeclasses/ http://ntypeclasses.codeplex.com/

Google Code Jam Japan 2011 予選問題B

日にちを逆から計算するというのは早めに気づいたのだけど、Largeを解けるようにするのにえらく時間がかかった。

ループをk回ずつまわさないようにするために、消費期限が長いものから順に何杯ずつ飲むのかを計算して掛け算する方針。

Haskellのポイントフリー

読みにくいからやめてほしい。 自己満足以外に実用的な意味があるのかどうか。 そもそも、セクションとかflipとかを使いまくらないと実現できないわけでしょう? unlambdaやlazy kは実用言語じゃないでしょう?