-- The composition of two Functors is also a Functor. import Data.Functor newtype Comp f g a = Comp { unComp :: f (g a) } compose :: f (g a) -> Comp f g a compose = Comp decompose :: Comp f g a -> f (g a) decompose = unComp instance (Functor f, Functor g) => Functor (Comp f g) where fmap f = compose . fmap (fmap f) . decompose