Copyright | (c) 2011 Patrick Bahr Tom Hvitved |
---|---|
License | BSD3 |
Maintainer | Tom Hvitved <hvitved@diku.dk> |
Stability | experimental |
Portability | non-portable (GHC Extensions) |
Safe Haskell | None |
Language | Haskell98 |
This module contains functionality for automatically deriving boilerplate
code using Template Haskell. Examples include instances of Difunctor
,
Difoldable
, and Ditraversable
.
Synopsis
- derive :: [Name -> Q [Dec]] -> [Name] -> Q [Dec]
- class EqD f where
- makeEqD :: Name -> Q [Dec]
- class EqD f => OrdD f where
- makeOrdD :: Name -> Q [Dec]
- class ShowD f where
- makeShowD :: Name -> Q [Dec]
- class Difunctor f
- makeDifunctor :: Name -> Q [Dec]
- class Difunctor f => Ditraversable f
- makeDitraversable :: Name -> Q [Dec]
- smartConstructors :: Name -> Q [Dec]
- smartAConstructors :: Name -> Q [Dec]
- liftSum :: Name -> Q [Dec]
Documentation
derive :: [Name -> Q [Dec]] -> [Name] -> Q [Dec] #
Helper function for generating a list of instances for a list of named
signatures. For example, in order to derive instances Functor
and
ShowF
for a signature Exp
, use derive as follows (requires Template
Haskell):
$(derive [makeFunctor, makeShowF] [''Exp])
Derive boilerplate instances for parametric signatures, i.e. signatures for parametric compositional data types.
EqD
Signature equality. An instance EqD f
gives rise to an instance
Eq (Term f)
. The equality test is performed inside the FreshM
monad for
generating fresh identifiers.
makeEqD :: Name -> Q [Dec] Source #
Derive an instance of EqD
for a type constructor of any parametric
kind taking at least two arguments.
OrdD
class EqD f => OrdD f where Source #
Signature ordering. An instance OrdD f
gives rise to an instance
Ord (Term f)
.
makeOrdD :: Name -> Q [Dec] Source #
Derive an instance of OrdD
for a type constructor of any parametric
kind taking at least two arguments.
ShowD
Signature printing. An instance ShowD f
gives rise to an instance
Show (Term f)
.
makeShowD :: Name -> Q [Dec] Source #
Derive an instance of ShowD
for a type constructor of any parametric
kind taking at least two arguments.
Difunctor
This class represents difunctors, i.e. binary type constructors that are contravariant in the first argument and covariant in the second argument.
makeDifunctor :: Name -> Q [Dec] Source #
Derive an instance of Difunctor
for a type constructor of any parametric
kind taking at least two arguments.
Ditraversable
class Difunctor f => Ditraversable f Source #
Difunctors representing data structures that can be traversed from left to right.
Instances
Ditraversable f => Ditraversable (f :&: p) Source # | |
(Ditraversable f, Ditraversable g) => Ditraversable (f :+: g) Source # | |
makeDitraversable :: Name -> Q [Dec] Source #
Derive an instance of Traversable
for a type constructor of any
first-order kind taking at least one argument.
Smart Constructors
smartConstructors :: Name -> Q [Dec] Source #
Derive smart constructors for a difunctor. The smart constructors are similar to the ordinary constructors, but a 'inject . dimap Var id' is automatically inserted.
Smart Constructors w/ Annotations
smartAConstructors :: Name -> Q [Dec] Source #
Derive smart constructors with annotations for a difunctor. The smart constructors are similar to the ordinary constructors, but a 'injectA . dimap Var id' is automatically inserted.