複数引数の関数合成

引数がふたつの場合、関数合成は(f .) . gになります。みっつの場合は、((f .) .) . gです。引数がひとつ増えるごとにかっこと.が増えていきます。Haskellの定石のひとつです。
んで、これって直感的に分かりにくいですよね。ということでオレオレ演算子を定義してみました。こんな感じ。お、意外と見やすいかもです。

module Main (main) where

(<.>) :: (b -> c) -> (a -> b) -> a -> c
(<.>) f g = f . g

(<..>) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
(<..>) f g = (f .) . g

(<...>) :: (b -> c) -> (a1 -> a2 -> a3 -> b) -> a1 -> a2 -> a3 -> c
(<...>) f g = ((f .) .) . g

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