• Ryan Scott's avatar
    Introduce DerivingVia · 8ed8b037
    Ryan Scott authored
    This implements the `DerivingVia` proposal put forth in
    This introduces the `DerivingVia` deriving strategy. This is a
    generalization of `GeneralizedNewtypeDeriving` that permits the user
    to specify the type to `coerce` from.
    The major change in this patch is the introduction of the
    `ViaStrategy` constructor to `DerivStrategy`, which takes a type
    as a field. As a result, `DerivStrategy` is no longer a simple
    enumeration type, but rather something that must be renamed and
    typechecked. The process by which this is done is explained more
    thoroughly in section 3 of this paper
    ( https://www.kosmikus.org/DerivingVia/deriving-via-paper.pdf ),
    although I have inlined the relevant parts into Notes where possible.
    There are some knock-on changes as well. I took the opportunity to
    do some refactoring of code in `TcDeriv`, especially the
    `mkNewTypeEqn` function, since it was bundling all of the logic for
    (1) deriving instances for newtypes and
    (2) `GeneralizedNewtypeDeriving`
    into one huge broth. `DerivingVia` reuses much of part (2), so that
    was factored out as much as possible.
    Bumps the Haddock submodule.
    Test Plan: ./validate
    Reviewers: simonpj, bgamari, goldfire, alanz
    Subscribers: alanz, goldfire, rwbarton, thomie, mpickering, carter
    GHC Trac Issues: #15178
    Differential Revision: https://phabricator.haskell.org/D4684
DsMeta.hs 104 KB