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