¿Puedo eliminar el uso de UndecidableInstances en esta instancia de Show para una mónada gratuita?

Acabo de intentar envolver mi cabeza alrededor de mónadas libres; Como ayuda para el aprendizaje, he logrado escribir unaShow instancia para el siguienteFree tipo:

{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}

-- Free monad datatype
data Free f a = Return a | Roll (f (Free f a))

instance Functor f => Monad (Free f) where
    return = Return
    Return a >>= f = f a
    Roll ffa >>= f = Roll $ fmap (>>= f) ffa

-- Show instance for Free; requires FlexibleContexts and
-- UndecidableInstances
instance (Show (f (Free f a)), Show a) => Show (Free f a) where
    show (Return x) = "Return (" ++ show x ++ ")"
    show (Roll ffx) = "Roll (" ++ show ffx ++ ")"


-- Identity functor with Show instance
newtype Identity a = Id a deriving (Eq, Ord)

instance Show a => Show (Identity a) where
    show (Id x) = "Id (" ++ show x ++ ")"

instance Functor (Identity) where
    fmap f (Id x)= Id (f x)


-- Example computation in the Free monad
example1 :: Free Identity String
example1 = do x <- return "Hello"
              y <- return "World"
              return (x ++ " " ++ y)

El uso deUndecidableInstances me molesta un poco ¿Hay una manera de hacerlo sin él? Todo lo que Google rinde esesta entrada de blog por Edward Kmett, que tiene de manera reconfortante básicamente lo mismoShow definición de clase como lo hago yo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta