複数引数の関数合成
引数がふたつの場合、関数合成は(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