¿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.