Folks,

I've added Hinze/PJ-style generic class definitions to GHC, based
on summer hacking done by Andrei Serjantov.  The design is based
very closely on the Haskell workshop 2000 paper
        http://www.informatik.uni-bonn.de/~ralf/Derive.ps.gz

For example:

  class Bin a where
    toBin   :: a -> [Int]
    fromBin :: [Int] -> (a, [Int])
  
    toBin {| Unit |}    Unit    = []
    toBin {| a :+: b |} (Inl x)   = 0 : toBin x
    toBin {| a :+: b |} (Inr y)   = 1 : toBin y
    toBin {| a :*: b |} (x :*: y) = toBin x ++ toBin y
  
  
    fromBin {| Unit |}    bs        = (Unit, bs)
    fromBin {| a :+: b |} (0:bs)  = (Inl x, bs')    where (x,bs') = fromBin
bs
    fromBin {| a :+: b |} (1:bs)  = (Inr y, bs')    where (y,bs') = fromBin
bs
    fromBin {| a :*: b |} bs       = (x :*: y, bs'') where (x,bs' ) =
fromBin bs
                                                (y,bs'') = fromBin bs'

Now we can say simply

        instance Bin a => Bin [a]

and the compiler will derive the appropriate code automatically.


This is now implemented and documented in the CVS version of GHC,
and will be in every future version of GHC.  (But I'm afraid we don't plan 
a binary release for a while.)  

At present we don't (alas) support constructor and field names, so you
can't implement Read and Show generically.  But I thought it was worth
getting committed what *is* done.

Simon

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

Reply via email to