Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Reiner Pope <reiner.pope <at> gmail.com>
Subject: Helper classes for Generics
Newsgroups: gmane.comp.lang.haskell.cafe
Date: Monday 12th March 2012 03:27:06 UTC (over 5 years ago)
Hi all,

I've been playing with GHC's new generics features (see http://www.haskell.org/ghc/docs/latest/html/users_guide/generic-programming.html).
All the documentation I've seen suggests creating a "helper class" -- for
instance, the GSerialize class in the above link -- on which one defines
generic instances. 

It seems to me that this isn't necessary. For example, here's the the
example from the GHC docs, but without a helper class:

> -- set the phantom type of Rep to (), to avoid ambiguity
> from0 :: Generic a => a -> Rep a ()
> from0 = from
> 
> data Bit = O | I
> 
> class Serialize a where
>   put :: a -> [Bit]
> 
>   default put :: (Generic a, Serialize (Rep a ())) => a -> [Bit]
>   put = put . from0
> 
> instance Serialize (U1 x) where
>   put U1 = []
> 
> instance (Serialize (a x), Serialize (b x)) => Serialize ((a :*: b) x)
where
>   put (x :*: y) = put x ++ put y
> 
> instance (Serialize (a x), Serialize (b x)) => Serialize ((a :+: b) x)
where
>   put (L1 x) = O : put x
>   put (R1 x) = I : put x
> 
> instance (Serialize (a x)) => Serialize (M1 i c a x) where
>   put (M1 x) = put x
> 
> instance (Serialize a) => Serialize (K1 i a x) where
>   put (K1 x) = put x

Is there a reason to prefer using helper classes? Or perhaps we should
update the wiki page (http://www.haskell.org/haskellwiki/Generics)
to avoid using helper classes?

Regards,
Reiner
 
CD: 3ms