Life Goes On

まあまあだけど楽しんでる方です

関数適用と関数合成

以前に出られなかった勉強会の資料を見てたら、flip id は flip ($) と同じと書いてありました。たしかに id :: a -> a で ($) :: (a -> b) -> (a -> b) だから、id の a を関数 a -> b と見れば、同じだ。
ということは

main = print $ (+3) $ (*2) $ 1

これはこう書き換えられるんだ!

main = print `id` ((+3) `id` ((*2) `id` 1))

面白いけど、ちょっと括弧がうっとおしい。
あれ?じゃあ、これはどう書き換えられるんだろう?

main = (print . (+3) . (*2)) 1

(.) :: (b -> c) -> (a -> b) -> a -> c か、う〜ん‥‥できない‥‥。
関数の書き換えだからコンビネータ?というわけでアンチョコを見てみる。
λabc.a(bc) は S(KS)K だって。じゃあこうか。

main = (print `comp` (+3) `comp` (*2)) 1
comp = (<*>) (const (<*>)) const

あ、動いた。でも中身が分かっていないので釈然としない。
もうちょっと他の書き方ができないのかなぁ?