Introduce DerivingVia

Authored by RyanGlScott on Jun 4 2018, 8:20 PM.

Description

Introduce DerivingVia

This implements the DerivingVia proposal put forth in
https://github.com/ghc-proposals/ghc-proposals/pull/120.

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: Trac #15178

Differential Revision: https://phabricator.haskell.org/D4684