Search code examples
haskellhugs

Why can I print a tuple with 5 elements but not with 6 in Haskell?


I tried printing the following tuple

(1,2,3,4,5,6)

which gave me the following error

ERROR - Cannot find "show" function for:
*** Expression : (1,2,3,4,5,6)
*** Of type    : (Integer,Integer,Integer,Integer,Integer,Integer)

But if I try it with the following tuple

(1,2,3,4,5)

everything works like a charm.

My guess is that Haskell only defines Show for tuples up to five elements (since a tuple of with 5 elements is apparently another type than a tuple with 6 elements). But somehow I am to stupid to find proof for that.

So my question is:

Why is this so, and how can I print a tuple with 6 elements (since it seems that I cannot put tuples in the head of an instance definition)?

Edit: I'm using Hugs


Solution

  • Here you go. Include this instance of Show for a 6-tuple

    -- Tuples   -- for ref, def'n from the Prelude
    {-
    instance  (Show a, Show b) => Show (a,b)  where
      showsPrec p (x,y) = showChar '(' . shows x . showChar ',' .
                                       shows y . showChar ')'
    
    
    instance  (Read a, Read b) => Read (a,b)  where
        readsPrec p       = readParen False
                            (\r -> [((x,y), w) | ("(",s) <- lex r,
                                                 (x,t)   <- reads s,
                                                 (",",u) <- lex t,
                                                 (y,v)   <- reads u,
                                                 (")",w) <- lex v ] )
    -}
    -- Other tuples have similar Read and Show instances
    
    instance  (Show a, Show b, Show c, Show d, Show e, Show f) 
          => Show (a,b,c,d,e,f)  where
      showsPrec p (x1,x2,x3,x4,x5,x6) = showChar '(' . shows x1 . showChar ',' .
                                       shows x2 . showChar ',' . 
                                       shows x3 . showChar ',' .
                                       shows x4 . showChar ',' .
                                       shows x5 . showChar ',' .
                                       shows x6 . showChar ')'