fmap2 :: (Functor f1, Functor f2) => (a -> b) -> f1 (f2 a) -> f1 (f2 b) fmap2 = fmap . fmap for :: Functor f => f a -> (a -> b) -> f b for = flip fmap infixr $: ($:) :: (Functor f, Functor g) => f (g a) -> (a -> b) -> f (g b) ($:) = flip fmap2 infixr $* ($*) :: Functor f => f a -> (b -> c) -> (a -> b) -> f c f $* g = for f $: g infixr $$ ($$) :: (Functor f, Functor g) => f a -> g b -> (a -> b -> c) -> f (g c) f $$ g = for f $: for g λ> ((+1) $* (*4) $* id $* (+10) $$ const 1) (,,,,) 0 3 5 7 2 (1,12,5,17,1)


$*랑 $$연산자를 쓰면 맨 아래같은 코드를 작성할 수 있음

(f1 $* f2 $$ f3) g x1 x2 x3 = g (f1 x1) (f2 x2) (f3 x3)
이런 느낌의 코드가 임의의 인자갯수에 대해서 가능한거