関数適用と関数合成
以前に出られなかった勉強会の資料を見てたら、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
あ、動いた。でも中身が分かっていないので釈然としない。
もうちょっと他の書き方ができないのかなぁ?