<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Hi all,</div><div><br></div>I've been playing with GHC's new generics features (see&nbsp;<a href="http://www.haskell.org/ghc/docs/latest/html/users_guide/generic-programming.html">http://www.haskell.org/ghc/docs/latest/html/users_guide/generic-programming.html</a>). 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.&nbsp;<div><br></div><div>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:</div><div><br></div><div>&gt; -- set the phantom type of Rep to (), to avoid ambiguity</div><div>&gt; from0 :: Generic a =&gt; a -&gt; Rep a ()</div><div>&gt; from0 = from</div><div>&gt;&nbsp;</div><div>&gt; data Bit = O | I</div><div>&gt;&nbsp;</div><div>&gt; class Serialize a where</div><div>&gt; &nbsp; put :: a -&gt; [Bit]</div><div>&gt;&nbsp;</div><div>&gt; &nbsp; default put :: (Generic a, Serialize (Rep a ())) =&gt; a -&gt; [Bit]</div><div>&gt; &nbsp; put = put . from0</div><div>&gt;&nbsp;</div><div>&gt; instance Serialize (U1 x) where</div><div>&gt; &nbsp; put U1 = []</div><div>&gt;&nbsp;</div><div>&gt; instance (Serialize (a x), Serialize (b x)) =&gt; Serialize ((a :*: b) x) where</div><div>&gt; &nbsp; put (x :*: y) = put x ++ put y</div><div>&gt;&nbsp;</div><div>&gt; instance (Serialize (a x), Serialize (b x)) =&gt; Serialize ((a :+: b) x) where</div><div>&gt; &nbsp; put (L1 x) = O : put x</div><div>&gt; &nbsp; put (R1 x) = I : put x</div><div>&gt;&nbsp;</div><div>&gt; instance (Serialize (a x)) =&gt; Serialize (M1 i c a x) where</div><div>&gt; &nbsp; put (M1 x) = put x</div><div>&gt;&nbsp;</div><div>&gt; instance (Serialize a) =&gt; Serialize (K1 i a x) where</div><div>&gt; &nbsp; put (K1 x) = put x</div><div><br></div><div>Is there a reason to prefer using helper classes? Or perhaps we should update the wiki page (<a href="http://www.haskell.org/haskellwiki/Generics">http://www.haskell.org/haskellwiki/Generics</a>) to avoid using helper classes?</div><div><br></div><div>Regards,</div><div>Reiner</div></body></html>