curry uncurry

http://d.hatena.ne.jp/notfound/20050903
(なぜ、((+1).(*)) 1 2 とできないか。)
curry ((+1). uncurry (*)) 1 2
で、どうでしょう。
curry というのは curry化して、uncurry というのはその逆です。
(a, b) -> c と a -> (b -> c) の間に自然な同型が存在するのはほぼ自明で、左から右に持っていくのが curry化です。

数学だったら、
fun1 a = a + 1
fun2 a b = a * b
として、
(fun1 . fun2) 1 2
を評価すると 3 になるけれども、それは普通の数学の関数が curry化されていなくて、慣れからそっちを期待してます。
つまり、高階でない
ufun2 (a,b) = a * b
です。そうすると、
ufun2の型は
ufun2 :: (a,a) -> a
fun1 :: a -> a
だから fun1 . ufun2 と合成できる。

または、fun2 . fun1 ならばこれは合成できますが、fun2 は a->(a->a) という型だから。
高階関数の合成も意味を持っていて、
((\f -> f (f 5)).(*)) 5
だとか
((!! 5) . (`iterate` 1) . (*)) 5
といった使い方はできますね。

ぱっとみ、ぶっちゃけ何言っているか分からね〜よ、この関数、というのには賛同しますが。

でも、やっぱり右から左に読むと分かるなあ(当たり前)。5から(5*)を作って、そこから iteraor で [1, 5, 25, 125...] というものを作って 5番目を取る。

ところで、(take $! 10) $! (enumFrom $! 0) が停止してしまうのは仕様なのか。分からなくなった。