Lib module Dynamic: bug in instances for tuples

Sigbjorn Finne sof@galois.com
Mon, 6 May 2002 11:33:26 -0700


Hi,

thanks for the report & fix; repository version updated.
Hopefully you didn't waste too much time tracking down
this bug.

--sigbjorn

----- Original Message ----- 
From: "Joost Visser" <Joost.Visser@cwi.nl>
To: <hugs-bugs@haskell.org>
Sent: Monday, May 06, 2002 10:54
Subject: Lib module Dynamic: bug in instances for tuples


> Hi,
> 
> The library module Dynamic provides instances of the Typeable class for
> various datatypes, among which tuples of various lengths. These
> instances are incorrect, as demonstrated by the following snippet:
> 
>   Dynamic> (typeOf (True,False)) == ((\(Dynamic t _) -> t) (toDyn
> (True,False)))
>   False
> 
> In other words, the type representation produced via the "typeOf" member
> is not equal to the type representation produced via the function
> "toDyn". This is wrong. As a result, casting back and forth to the type
> Dynamic fails:
> 
>   Dynamic> fromDynamic (toDyn (True,False)) :: Maybe (Bool,Bool)
>   Nothing
> 
> The error is caused by the nested definition of tup2Tc in the following
> instance declaration:
> 
>   instance (Typeable a, Typeable b) => Typeable (a,b) where
>     typeOf tu = mkAppTy tup2Tc [typeOf (fst tu), typeOf (snd tu)]
>       where
>         fst :: (a,b) -> a
>         fst = undefined
>         snd :: (a,b) -> b
>         snd = undefined
> 
>         tup2Tc = mkTyCon ","
> 
> If tup2Tc is made top-level, the error vanishes. Likewise for longer
> tuples.
> 
> The reason that TyCons must be defined top-level is that they are
> shared, so they can be mapped onto Ints and compared efficiently. When
> defined nested inside the instance declaration, this sharing apparently
> fails.
> 
> Regards,
>   Joost Visser
> 
> PS: I'm using hugs98-Dec2001.