| Copyright | (C) 2015-2017 Ryan Scott |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | Ryan Scott |
| Portability | Template Haskell |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Foldable.Deriving
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.
Foldable
deriveFoldable :: Name -> Q [Dec] Source #
Generates a Foldable instance declaration for the given data type or data
family instance.
makeFold :: Name -> Q Exp Source #
Generates a lambda expression which behaves like fold (without requiring a
Foldable instance).
deriveFoldable limitations
Be aware of the following potential gotchas:
- If you are using the
-XGADTsor-XExistentialQuantificationextensions, an existential constraint cannot mention the last type variable. For example,data Illegal a = forall a. Show a => Illegal acannot have a derivedFunctorinstance. - Type variables of kind
* -> *are assumed to haveFoldableconstraints. If this is not desirable, usemakeFoldrormakeFoldMap.