| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
GHC.Tc.Deriv.Functor
Description
The deriving code for the Functor, Foldable, and Traversable classes
Synopsis
- data FFoldType a = FT {}
- functorLikeTraverse :: forall a. TyVar -> FFoldType a -> Type -> a
- deepSubtypesContaining :: TyVar -> Type -> [TcType]
- foldDataConArgs :: FFoldType a -> DataCon -> DerivInstTys -> [a]
- gen_Functor_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec)
- gen_Foldable_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec)
- gen_Traversable_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec)
Documentation
Constructors
| FT | |
Fields
| |
deepSubtypesContaining :: TyVar -> Type -> [TcType] Source #
Return all syntactic subterms of a Type that are applied to the TyVar
argument. This determines what constraints should be inferred for derived
Functor, Foldable, and Traversable instances in GHC.Tc.Deriv.Infer.
For instance, if we have:
data Foo a = MkFoo Int a (Maybe a) (Either Int (Maybe a))
Then the following would hold:
would returndeepSubtypesContaininga Int[], sinceIntdoes not contain the type variableaat all.would returndeepSubtypesContaininga a[]. Although the typeacontains the type variablea, it is not applied toa, which is the criterion thatdeepSubtypesContainingchecks for.would returndeepSubtypesContaininga (Maybe a)[Maybe], asMaybeis applied toa.would returndeepSubtypesContaininga (Either Int (Maybe a))[Either Int, Maybe]. Both of these types are applied toathrough composition.
As used in GHC.Tc.Deriv.Infer, the Type argument will always come from
derivDataConInstArgTys, so it is important that the TyVar comes from
dataConUnivTyVars to match. Make sure not to take the TyVar from
tyConTyVars, as these differ from the dataConUnivTyVars when the data
type is a GADT. (See #22167 for what goes wrong if tyConTyVars is used.)
foldDataConArgs :: FFoldType a -> DataCon -> DerivInstTys -> [a] Source #
gen_Functor_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec) Source #
gen_Foldable_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec) Source #
gen_Traversable_binds :: SrcSpan -> DerivInstTys -> (LHsBinds GhcPs, Bag AuxBindSpec) Source #