Datatype Generic Programming

Today I had the pleasure of attending a talk by Andres entitled “Datatype-Generic Programming”, where Andres discussed how we can almost leverage the power of the deriving construct for our own type classes.

Interestingly, this was a Haskell talk where I initially left thinking that, while impressive there wasn’t particularly a “wow” moment. But then it hit me on the train back - the wow is really in the fact that it’s all so simple! Generic programming, at least with deriving Generic is straightforward, and the applications are immediately obvious. It really helped that the talk was well paced, and I left feeling I had a good understanding of the theory - switch over to an isomorphic type representation with a limited set of constructors, implement your type class there, and you can then provide wrappers to use generic solutions.

The generic-deriving also got a mention towards the end of the talk, and it turns out this is a library I’ve really been wanting. I was aware that it was possible to write generic implementations of, for example, Monoid for a while - but usually the overhead of writing a generic version first was greater than just writing a single Monoid instance. I was happy to find out that people have already done this hard work, so now I just need to use the default implementations.

For example:

data Factory = Factory { trinkets :: Set Trinket
                       , widgets :: Set Widget
                       }
  deriving (Generic)

instance Monoid Factory where
  mappend = mappenddefault
  mempty = memptydefault

Does exactly what I want. Splendid.


You can contact me via email at ollie@ocharles.org.uk or tweet to me @acid2. I share almost all of my work at GitHub. This post is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

I accept Bitcoin donations: 14SsYeM3dmcUxj3cLz7JBQnhNdhg7dUiJn. Alternatively, please consider leaving a tip on