{-# language ImpredicativeTypes #-} import Data.Distributive forward :: Functor f => f (forall a. f a) -> (forall a. f (f a)) forward a = fmap (\b -> fmap (\c -> c) b) a reverse :: Distributive f => (forall a. f (f a)) -> f (forall a. f a) reverse a = distribute a