Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- type DerivM = ReaderT DerivEnv TcRn
- data DerivEnv = DerivEnv {
- denv_overlap_mode :: Maybe OverlapMode
- denv_tvs :: [TyVar]
- denv_cls :: Class
- denv_cls_tys :: [Type]
- denv_tc :: TyCon
- denv_tc_args :: [Type]
- denv_rep_tc :: TyCon
- denv_rep_tc_args :: [Type]
- denv_mtheta :: DerivContext
- denv_strat :: Maybe DerivStrategy
- data DerivSpec theta = DS {
- ds_loc :: SrcSpan
- ds_name :: Name
- ds_tvs :: [TyVar]
- ds_theta :: theta
- ds_cls :: Class
- ds_tys :: [Type]
- ds_tc :: TyCon
- ds_overlap :: Maybe OverlapMode
- ds_mechanism :: DerivSpecMechanism
- pprDerivSpec :: Outputable theta => DerivSpec theta -> SDoc
- data DerivSpecMechanism
- = DerivSpecStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name]))
- | DerivSpecNewtype Type
- | DerivSpecAnyClass
- isDerivSpecStock :: DerivSpecMechanism -> Bool
- isDerivSpecNewtype :: DerivSpecMechanism -> Bool
- isDerivSpecAnyClass :: DerivSpecMechanism -> Bool
- type DerivContext = Maybe ThetaType
- data DerivStatus
- data PredOrigin = PredOrigin PredType CtOrigin TypeOrKind
- data ThetaOrigin = ThetaOrigin {}
- mkPredOrigin :: CtOrigin -> TypeOrKind -> PredType -> PredOrigin
- mkThetaOrigin :: CtOrigin -> TypeOrKind -> [TyVar] -> [TyVar] -> ThetaType -> ThetaType -> ThetaOrigin
- mkThetaOriginFromPreds :: [PredOrigin] -> ThetaOrigin
- substPredOrigin :: HasCallStack => TCvSubst -> PredOrigin -> PredOrigin
- checkSideConditions :: DynFlags -> DerivContext -> Class -> [TcType] -> TyCon -> DerivStatus
- hasStockDeriving :: Class -> Maybe (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name]))
- canDeriveAnyClass :: DynFlags -> Validity
- std_class_via_coercible :: Class -> Bool
- non_coercible_class :: Class -> Bool
- newDerivClsInst :: ThetaType -> DerivSpec theta -> TcM ClsInst
- extendLocalInstEnv :: [ClsInst] -> TcM a -> TcM a
Documentation
Contains all of the information known about a derived instance when
determining what its EarlyDerivSpec
should be.
DerivEnv | |
|
DS | |
|
pprDerivSpec :: Outputable theta => DerivSpec theta -> SDoc Source #
data DerivSpecMechanism Source #
DerivSpecStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name])) | |
DerivSpecNewtype Type | |
DerivSpecAnyClass |
Instances
Outputable DerivSpecMechanism # | |
Defined in TcDerivUtils |
type DerivContext = Maybe ThetaType Source #
data DerivStatus Source #
data PredOrigin Source #
A PredType
annotated with the origin of the constraint CtOrigin
,
and whether or the constraint deals in types or kinds.
Instances
Outputable PredOrigin # | |
Defined in TcDerivUtils |
data ThetaOrigin Source #
A list of wanted PredOrigin
constraints (to_wanted_origins
) to
simplify when inferring a derived instance's context. These are used in all
deriving strategies, but in the particular case of DeriveAnyClass
, we
need extra information. In particular, we need:
to_anyclass_skols
, the list of type variables bound by a class method's regular type signature, which should be rigid.to_anyclass_metas
, the list of type variables bound by a class method's default type signature. These can be unified as necessary.to_anyclass_givens
, the list of constraints from a class method's regular type signature, which can be used to help solve constraints in theto_wanted_origins
.
(Note that to_wanted_origins
will likely contain type variables from the
derived type class or data type, neither of which will appear in
to_anyclass_skols
or to_anyclass_metas
.)
For all other deriving strategies, it is always the case that
to_anyclass_skols
, to_anyclass_metas
, and to_anyclass_givens
are
empty.
Here is an example to illustrate this:
class Foo a where bar :: forall b. Ix b => a -> b -> String default bar :: forall y. (Show a, Ix y) => a -> y -> String bar x y = show x ++ show (range (y, y)) baz :: Eq a => a -> a -> Bool default baz :: Ord a => a -> a -> Bool baz x y = compare x y == EQ data Quux q = Quux deriving anyclass Foo
Then it would generate two ThetaOrigin
s, one for each method:
[ ThetaOrigin { to_anyclass_skols = [b] , to_anyclass_metas = [y] , to_anyclass_givens = [Ix b] , to_wanted_origins = [ Show (Quux q), Ix y , (Quux q -> b -> String) ~ (Quux q -> y -> String) ] } , ThetaOrigin { to_anyclass_skols = [] , to_anyclass_metas = [] , to_anyclass_givens = [Eq (Quux q)] , to_wanted_origins = [ Ord (Quux q) , (Quux q -> Quux q -> Bool) ~ (Quux q -> Quux q -> Bool) ] } ]
(Note that the type variable q
is bound by the data type Quux
, and thus
it appears in neither to_anyclass_skols
nor to_anyclass_metas
.)
See Note [Gathering and simplifying constraints for DeriveAnyClass]
in TcDerivInfer for an explanation of how to_wanted_origins
are
determined in DeriveAnyClass
, as well as how to_anyclass_skols
,
to_anyclass_metas
, and to_anyclass_givens
are used.
ThetaOrigin | |
|
Instances
Outputable ThetaOrigin # | |
Defined in TcDerivUtils |
mkPredOrigin :: CtOrigin -> TypeOrKind -> PredType -> PredOrigin Source #
mkThetaOrigin :: CtOrigin -> TypeOrKind -> [TyVar] -> [TyVar] -> ThetaType -> ThetaType -> ThetaOrigin Source #
substPredOrigin :: HasCallStack => TCvSubst -> PredOrigin -> PredOrigin Source #
checkSideConditions :: DynFlags -> DerivContext -> Class -> [TcType] -> TyCon -> DerivStatus Source #
hasStockDeriving :: Class -> Maybe (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name])) Source #
canDeriveAnyClass :: DynFlags -> Validity Source #
std_class_via_coercible :: Class -> Bool Source #
non_coercible_class :: Class -> Bool Source #