TemplateHaskell deriving strategy
It would be great for the user experience of template-haskell to have blessed support as a deriving strategy.
https://github.com/ElderEphemera/deriving-th shows how that would look in user land, as follows:
- Define a "wired-in" type class
class DeriveTH (cls :: k) where deriveTH :: Name -> Q [Dec] - Allow library authors of libraries such as
aeson, which defineclass ToJSON a where ..., to provide a deriving strategy throughinstance DeriveTH ToJSON where deriveTH typeName = [d | instance ToJSON $(..typeName) |] - Now clients of
aesoncan writedata Foo = F Int Bool deriving ToJSON via template
There's a big caveat, though: Clients have to buy into this approach by compiling and using a source plugin. In my experience, this would be cumbersome enough for me not to ever do it. Of course, I can still write
$(deriveTH @ToJSON ''Foo)
But then I might just as well do
$(Data.Aeson.deriveJSON defaultOptions ''Foo)
as today. The point about via template is the native feel, and without it the whole DeriveTH approach seems moot.
So what this issue entails is
- Flesh the idea out as a ghc-proposal
- Define and wire-in
class DeriveTH - Make
via templatedesugar to the right$(deriveTH @C ''D)invokation.
This might even be fun to a newcomer.
Edited by Sebastian Graf