[Haskell-beginners] No instance for (Show a)

Daniel Fischer daniel.is.fischer at googlemail.com
Sun Jul 31 11:37:57 CEST 2011


On Sunday 31 July 2011, 11:19:36, Ovidiu Deac wrote:
> For some reason ghc complains about not being able to call show on an
> Integer (?!?!?)

No, it complains about not being able to call show on a value of arbitrary 
type. Your

instance Show (Stack a) where

says you can show stacks of arbitrary type, so nothing can be assumed about 
the element type, but in the implementation you try to call show on the top 
element.
To make it work, you have to tell GHC that the elements can be shown,

instance (Show a) => Show (Stack a) where
   -- what you have

would work. The "(Show a) =>" part says roughly "if elements of the stack 
can be shown, then the stack can be shown".

> 
> Please enlighten me!
> 
> ovidiu
> 
> This is the hspec:
>     it "shows one element"
>         ( show (push 1 EmptyStack) ≡ "Stack(1)")
> 
> ...this is the code:
> 
> data Stack a =
>     EmptyStack |
>     StackEntry a (Stack a)
>     deriving(Eq)
> 
> 
> instance Show (Stack a) where
>     show s =
>         "Stack(" ⊕ (showImpl s) ⊕ ")"
>         where
>             showImpl EmptyStack = ""
>             showImpl (StackEntry x _) = show x
> 
> ...and this is the error:
> 
> src/Stack.hs:12:22:
>     No instance for (Show a)
>       arising from a use of `showImpl'
>     In the first argument of `(++)', namely `(showImpl s)'
>     In the second argument of `(++)', namely `(showImpl s) ++ ")"'
>     In the expression: "Stack(" ++ (showImpl s) ++ ")"
> 



More information about the Beginners mailing list