data Free f a = Var a | Node (f (Free f a)) instance Functor f => Functor (Free f) where fmap g (Var a) = g a fmap g (Node a) = fmap g a instance Functor f => Monad (Free f) where return a = Var a (Var a) >>= g = g a (Node a) >>= g = fmap g a