This package offers a version of
GHC.Generics
with two important improvements:
-
The
to
,from
,to1
, andfrom1
methods have multiplicity-polymorphic types, allowing them to be used with either traditional Haskell code or linearly typed code. -
The representations used for
Generic1
are modified slightly.- Composition associates to the left in the generic representation. As a result,
to1
andfrom1
never need to usefmap
. This can greatly improve performance, and it is necessary to support multiplicity polymorphism, as discussed here. - Generic representations no longer use
Rec1 f
, they usePar1 :.: f
instead, as proposed by spl. This way you no longer need to writeRec1
instances for your derivers.
For more details, see the
Generics.Linear
documentation. - Composition associates to the left in the generic representation. As a result,
This library is organized as follows:
-
Generics.Linear
defines the core functionality for generics. This includes:- multiplicity polymorphic
Generic
andGeneric1
classes, - a replacement for the
:.:
composition type, and - an
MP1
type for nonlinear and multiplicity polymorphic fields.
- multiplicity polymorphic
-
Generics.Linear.TH
implements Template Haskell functionality for deriving instances ofGeneric(1)
. -
Generics.Linear.Unsafe.ViaGHCGenerics
offersDerivingVia
targets to derive bothGeneric
andGeneric1
instances fromGHC.Generics.Generic
. Because these instances necessarily use unsafe coercions, their use will likely inhibit full optimization of code using them (see this wiki page for more on the GHC internals, along with commentary inUnsafe.Coerce
).
Educational code: the educational modules exported by
generic-deriving
have been copied into the tests/Generic/Deriving
directory
in this repository, with the very few modifications required to
accommodate the differences between the Generic1
representations
here and in base
. All the same caveats apply as in the originals;
see that package's README
.