I defined type recursion and naturals as
newtype Mu f = In {unIn :: f (Mu f)} data N f = S f | Z type Nat = Mu N
An application of Mu should be showable if the functor maps showable types to showable types, so the most natural way to define the instance seemed to be
instance (Show a => Show (f a)) => Show (Mu f) where show (In x) = show x
Of course that constraint didn't work.
Well, it can if we write it in a bit different way: instance (Show (f (Mu f))) => Show (Mu f) where show (In x) = show x instance Show (N (Mu N)) where show Z = "Z" show (S k) = "S "++show k *Main> show (In (S (In (S (In Z))))) "S S Z" This solution is akin to that of breaking the type recursion when defining the fixpoint combinator fix. Only here we face the recursion on constraints. I believe the same solution should work for the Observable class. You didn't post the definition of the Observable class, so I couldn't test my claim. Flags used: ghci -fglasgow-exts -fallow-undecidable-instances /tmp/a.hs