Skip to content

Allow the use of `deriving` for GHC generics

Currently, a class that makes use of generic default methods (via the DefaultSignatures) extension can be instantiated by providing an empty instance declaration.

I propose to allow the use of deriving as well:

  1. Standalone deriving should be usable for a class not only for the specific set of classes supported by GHC now, but in addition for any class, if (

* there's at least one generic default given for a method of the class, and

* there are generic or normal default implementations for *all* methods of the class.

There are a number of advantages of this solution over the empty instance declaration: we make it explicit that something generic is going on here; we ensure at compile time that we're not missing an implementation of a method; and we come syntactically closer to built-in derivable classes.

In cases where a conflict arises between current GHC semantics and the proposed semantics (for example, when newtype-deriving is involved, I guess), I propose to stick with current GHC semantics, but I'm open for other suggestions.

  1. I'd also like for normal deriving to be useful under the same conditions as above. For normal deriving GHC has to figure out the class context automatically. I propose that if normal deriving is used, GHC uses the same heuristic for figuring out the class context that it uses for Eq in the case of *-kinded classes, and for Functor in the case of * -> *-kinded classes. That may not be optimal or even wrong. But in such cases, standalone deriving can still be used.
Edited by Simon Peyton Jones
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information