deriving-compat-0.2.2: Backports of GHC deriving extensions

Copyright(C) 2015-2016 Ryan Scott
LicenseBSD-style (see the file LICENSE)
MaintainerRyan Scott
PortabilityTemplate Haskell
Safe HaskellNone
LanguageHaskell2010

Data.Foldable.Deriving

Contents

Description

Exports functions to mechanically derive Foldable instances in a way that mimics how the -XDeriveFoldable extension works since GHC 8.0.

These changes make it possible to derive Foldable instances for data types with existential constraints, e.g.,

data WrappedSet a where
    WrapSet :: Ord a => a -> WrappedSet a

deriving instance Foldable WrappedSet -- On GHC 8.0  on later
$(deriveFoldable ''WrappedSet)        -- On GHC 7.10 and earlier

In addition, derived Foldable instances from this module do not generate superfluous mempty expressions in its implementation of foldMap. One can verify this by compiling a module that uses deriveFoldable with the -ddump-splices GHC flag.

For more info on these changes, see this GHC wiki page.

Synopsis

Foldable

deriveFoldable :: Name -> Q [Dec] Source #

Generates a Foldable instance declaration for the given data type or data family instance.

makeFoldMap :: Name -> Q Exp Source #

Generates a lambda expression which behaves like foldMap (without requiring a Foldable instance).

makeFoldr :: Name -> Q Exp Source #

Generates a lambda expression which behaves like foldr (without requiring a Foldable instance).

makeFold :: Name -> Q Exp Source #

Generates a lambda expression which behaves like fold (without requiring a Foldable instance).

makeFoldl :: Name -> Q Exp Source #

Generates a lambda expression which behaves like foldl (without requiring a Foldable instance).

deriveFoldable limitations

Be aware of the following potential gotchas:

  • If you are using the -XGADTs or -XExistentialQuantification extensions, an existential constraint cannot mention the last type variable. For example, data Illegal a = forall a. Show a => Illegal a cannot have a derived Functor instance.
  • Type variables of kind * -> * are assumed to have Foldable constraints. If this is not desirable, use makeFoldr or makeFoldMap.