複数引数の関数合成そのに
複数引数の関数合成 - 趣味的にっきをポイントフリーにしてみました。ぱっと見よくわからないのは相変わらずですが、何だこのきれいさは!! おどろきです。
module Main (main) where (<.>) :: (b -> c) -> (a -> b) -> a -> c (<.>) = (.) (<..>) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c (<..>) = (.) . (.) (<...>) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c (<...>) = (.) . (.) . (.) foo1 a1 = a1 foo2 a1 a2 = a1 + a2 foo3 a1 a2 a3 = a1 + a2 + a3 main :: IO () main = do print $ (succ <.> foo1) 1 -- => 2 print $ (succ <..> foo2) 1 2 -- => 4 print $ (succ <...> foo3) 1 2 3 -- => 7
ちなみにポイントフリーに移行する過程はこんな感じ。
(<.>) :: (b -> c) -> (a -> b) -> a -> c -- (<.>) f g = f . g -- (<.>) f g = (.) f g (<.>) = (.)
(<..>) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c -- (<..>) f g = (f .) . g -- (<..>) f g = (.) (f .) g -- (<..>) f = (.) (f .) -- (<..>) f = (.) ((.) f) -- (<..>) f = (.) $ (.) f (<..>) = (.) . (.)
(<...>) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c -- (<...>) f g = ((f .) .) . g -- (<...>) f g = (.) ((f .) .) g -- (<...>) f = (.) ((f .) .) -- (<...>) f = (.) ((.) (f .)) -- (<...>) f = (.) $ (.) (f .) -- (<...>) f = (.) $ (.) ((.) f) -- (<...>) f = (.) $ (.) $ (.) f (<...>) = (.) . (.) . (.)