ちなみに、次のような RULES プラグマを書いておけば、
最適化コンパイル時に、2回続けた reverse は無かったことにできる

{-# RULES "double reverse" forall xs. reverse (reverse xs) = xs #-}
{-# RULES "double reverse $" forall xs. reverse $ reverse xs = xs #-}
{-# RULES "double reverse ." reverse . reverse = id #-}

この場合いちいち複数のケースを書いておかなければいけないのが面倒だが