 <p>Absurd over-generalization:</p> <p>Every <code>Traversable</code> instance supports a horrible hack implementing <code>reverse</code>. There may be a cleaner or more efficient way to do this; I'm not sure.</p> <pre><code>module Rev where import Data.Traversable import Data.Foldable import Control.Monad.Trans.State.Strict import Prelude hiding (foldl) fill :: Traversable t =&gt; t b -&gt; [a] -&gt; t a fill = evalState . traverse go where go _ = do xs &lt;- get put (drop 1 xs) return (head xs) reverseT :: Traversable t =&gt; t a -&gt; t a reverseT xs = fill xs $ foldl (flip (:)) [] xs reverseAll :: (Functor f, Traversable t) =&gt; f (t a) -&gt; f (t a) reverseAll = fmap reverseT </code></pre>