Martin Sj�gren wrote:

> I have a problem with Data.Dynamic. The problem is probably that I don't
> understand it. From my understanding, the following program should work:
> 
> -8<------------------------
> import Data.Dynamic
> 
> data Foo = Foo { x :: Int }
>         deriving Show
> 
> instance Typeable Foo where
>     typeOf _ = mkAppTy (mkTyCon "Foo.Foo") []
> 
> 
> main = do
>     let dynObj = toDyn $ Foo 42
>     print dynObj
>     let Just obj = fromDynamic dynObj :: Maybe Foo
>     print obj
> -8<------------------------
> 
> But when I compile it (ghc Foo.hs) and run it (./a.out) I get:
> 
> <<Foo.Foo>>
> 
> Fail: Foo.hs:13: Irrefutable pattern failed for pattern (Data.Maybe.Just
> obj)
> 
> Which indicates that fromDynamic returned Nothing. What is the problem
> here? Do I have to employ special trickery to use Dynamic with records?

You have to ensure that the TyCon is unique. A comment in Dynamic.hs
says:

-- | Builds a 'TyCon' object representing a type constructor.  An
-- implementation of "Data.Dynamic" should ensure that the following holds:
--
-- >  mkTyCon "a" == mkTyCon "a"
--
-- NOTE: GHC\'s implementation is quite hacky, and the above equation
-- does not necessarily hold.  For defining your own instances of
-- 'Typeable', try to ensure that only one call to 'mkTyCon' exists
-- for each type constructor (put it at the top level, and annotate the
-- corresponding definition with a @NOINLINE@ pragma).

If you use:

        fooTc = mkTyCon "Foo.Foo"
        
        instance Typeable Foo where
            typeOf _ = mkAppTy fooTc []

or compile with "-O", your program works.

-- 
Glynn Clements <[EMAIL PROTECTED]>
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to