Novice Haskell query

Ashley Yakeley ashley@semantic.org
Tue, 31 Jul 2001 15:49:22 -0700


At 2001-07-31 14:17, Mark Carroll wrote:

>Now, "show x" will work, and "show y" won't. How can I write things so
>that I can show both x and y? I don't seem to be able to write, say,
>
>  instance Show a => Show (Tree a) where
>      show (Branch datum left right) =
>        show left ++ " <- " ++ show datum ++ " -> " ++ show right
>  
>  instance Show (Tree a) where
>      show Leaf = "*"

These two instances overlap. You want one instance, with both Branch and 
Leaf alternatives in the 'show' function.

>or, perhaps,
>
>  instance Show (Tree a) where
>      Show a => show (Branch datum left right) =
>        show left ++ " <- " ++ show datum ++ " -> " ++ show right
>      show Leaf = "*"

Close, but you're making a promise (that 'Tree a' is Show for _any_ 'a') 
that you can't fulfill. Attempting to restrict the type of 'a' while 
defining the function is bogus, the 'a' symbol simply isn't in scope at 
that point.

Clearly the type 'Tree a' is only Show if 'a' is. It's irrelevant that 
the 'Leaf' part of the definition doesn't need 'a' to be Show: the 
'Branch' part does, so the type has to be restricted to 'Show a => Tree 
a' if it is going to be Show.

So you want this:

instance Show a => Show (Tree a) where
     ...


-- 
Ashley Yakeley, Seattle WA