複数引数の関数合成そのに

複数引数の関数合成 - 趣味的にっきをポイントフリーにしてみました。ぱっと見よくわからないのは相変わらずですが、何だこのきれいさは!! おどろきです。

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
(<...>) = (.) . (.) . (.)