Могу ли я отказаться от использования UndecidableInstances в этом экземпляре Show для Free Monad?

Я только что пытался разобраться со свободными монадами; в качестве учебного пособия мне удалось написать экземпляр Showдля следующего Freeтипа:

{-# 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)

Использование UndecidableInstancesнесколько беспокоит меня; есть ли способ обойтись без него? Все, что выдает Google, — это это сообщение в блоге Эдварда Кметта, в котором, к счастью, содержится то же определение класса Show, что и у меня.

5
задан Luis Casillas 4 June 2012 в 00:57
поделиться