Mon, 28 May 2001 01:01:44 -0400
On Sun, May 27, 2001 at 10:46:37PM -0500, Jay Cox wrote:
> >data S m a = Nil | Cons a (m (S m a))
> >instance (Show a, Show (m (S m a))) => Show (S m a) where
> > show Nil = "Nil"
> > show (Cons x y) = "Cons " ++ show x ++ " " ++ show y
> >show s
> >s = Cons 3 [Cons 4 , Cons 5 [Cons 2 ,Cons 3 ]]
> Anyway, is my instance declaration still a bit mucked up?
Hmm. To try to deduce Show (S  Integer), the type checker reduces
it by your instance declaration to Show [S  Integer], which reduces
to Show (S  Integer), which reduces to...
ghci or hugs could, in theory, be slightly smarter and handle this case.
> Also, could there be a way to give a definition of show for S  a?
Yes. You could drop the generality:
instance (Show a) => Show (S  a) where
show Nil = "Nil"
show (Cons x y) = "Cons " ++ show x ++ " " ++ show y
Really, the context you want is something like
instance (Show a, forall b. Show b => Show (m b)) => Show (S m b) ...
if that were legal.