deriving-compat-0.3.6: Backports of GHC deriving extensions

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.

Synopsis

# Foldable

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

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

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

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

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.