{-| Module: Data.Traversable.Deriving Copyright: (C) 2015-2017 Ryan Scott License: BSD-style (see the file LICENSE) Maintainer: Ryan Scott Portability: Template Haskell Exports functions to mechanically derive 'Traversable' instances in a way that mimics how the @-XDeriveTraversable@ extension works since GHC 8.0. Derived 'Traversable' instances from this module do not generate superfluous 'pure' expressions in its implementation of 'traverse'. One can verify this by compiling a module that uses 'deriveTraversable' with the @-ddump-splices@ GHC flag. These changes make it possible to derive @Traversable@ instances for data types with unlifted argument types, e.g., @ data IntHash a = IntHash Int# a deriving instance Traversable IntHash -- On GHC 8.0 on later $(deriveTraversable ''IntHash) -- On GHC 7.10 and earlier @ For more info on these changes, see . -} module Data.Traversable.Deriving ( -- * 'Traversable' deriveTraversable , deriveTraversableOptions , makeTraverse , makeTraverseOptions , makeSequenceA , makeSequenceAOptions , makeMapM , makeMapMOptions , makeSequence , makeSequenceOptions -- * 'FFTOptions' , FFTOptions(..) , defaultFFTOptions -- * 'deriveTraversable' limitations -- $constraints ) where import Data.Functor.Deriving.Internal {- $constraints 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 'Traversable' instance. * Type variables of kind @* -> *@ are assumed to have 'Traversable' constraints. If this is not desirable, use 'makeTraverse'. -}