Coercion
Contents
Description
Module for (a) type kinds and (b) type coercions,
as used in System FC. See CoreSyn.Expr for
more on System FC and how coercions fit into it.
Coercions are represented as types, and their kinds tell what types the coercion works on. The coercion kind constructor is a special TyCon that must always be saturated, like so:
typeKind (symCoercion type) :: TyConApp CoTyCon{...} [type, type]
- type Coercion = Type
- type Kind = Type
- typeKind :: Type -> Kind
- kindFunResult :: Kind -> Kind
- kindAppResult :: Kind -> [arg] -> Kind
- synTyConResKind :: TyCon -> Kind
- splitKindFunTys :: Kind -> ([Kind], Kind)
- splitKindFunTysN :: Int -> Kind -> ([Kind], Kind)
- splitKindFunTy_maybe :: Kind -> Maybe (Kind, Kind)
- isLiftedTypeKind :: Kind -> Bool
- isUnliftedTypeKind :: Kind -> Bool
- isOpenTypeKind :: Kind -> Bool
- isUbxTupleKind :: Kind -> Bool
- isArgTypeKind :: Kind -> Bool
- isKind :: Kind -> Bool
- isTySuperKind :: SuperKind -> Bool
- isCoSuperKind :: SuperKind -> Bool
- isSuperKind :: Type -> Bool
- isCoercionKind :: Kind -> Bool
- mkArrowKind :: Kind -> Kind -> Kind
- mkArrowKinds :: [Kind] -> Kind -> Kind
- isSubArgTypeKind :: Kind -> Bool
- isSubOpenTypeKind :: Kind -> Bool
- isSubKind :: Kind -> Kind -> Bool
- defaultKind :: Kind -> Kind
- eqKind :: Kind -> Kind -> Bool
- isSubKindCon :: TyCon -> TyCon -> Bool
- mkCoKind :: Type -> Type -> CoercionKind
- mkCoPredTy :: Type -> Type -> Type -> Type
- coVarKind :: CoVar -> (Type, Type)
- coVarKind_maybe :: CoVar -> Maybe (Type, Type)
- coercionKind :: Coercion -> (Type, Type)
- coercionKinds :: [Coercion] -> ([Type], [Type])
- isIdentityCoercion :: Coercion -> Bool
- isEqPred :: PredType -> Bool
- mkEqPred :: (Type, Type) -> PredType
- getEqPredTys :: PredType -> (Type, Type)
- isEqPredTy :: Type -> Bool
- mkCoercion :: TyCon -> [Type] -> Coercion
- mkSymCoercion :: Coercion -> Coercion
- mkTransCoercion :: Coercion -> Coercion -> Coercion
- mkLeftCoercion :: Coercion -> Coercion
- mkRightCoercion :: Coercion -> Coercion
- mkInstCoercion :: Coercion -> Type -> Coercion
- mkAppCoercion :: Coercion -> Coercion -> Coercion
- mkTyConCoercion :: TyCon -> [Coercion] -> Coercion
- mkFunCoercion :: Coercion -> Coercion -> Coercion
- mkForAllCoercion :: Var -> Coercion -> Coercion
- mkInstsCoercion :: Coercion -> [Type] -> Coercion
- mkUnsafeCoercion :: Type -> Type -> Coercion
- mkNewTypeCoercion :: Name -> TyCon -> [TyVar] -> Type -> TyCon
- mkFamInstCoercion :: Name -> [TyVar] -> TyCon -> [Type] -> TyCon -> TyCon
- mkAppsCoercion :: Coercion -> [Coercion] -> Coercion
- mkCsel1Coercion :: Coercion -> Coercion
- mkCsel2Coercion :: Coercion -> Coercion
- mkCselRCoercion :: Coercion -> Coercion
- mkClassPPredCo :: Class -> [Coercion] -> Coercion
- mkIParamPredCo :: IPName Name -> Coercion -> Coercion
- mkEqPredCo :: Coercion -> Coercion -> Coercion
- mkCoVarCoercion :: CoVar -> Coercion
- mkCoPredCo :: Coercion -> Coercion -> Coercion -> Coercion
- unsafeCoercionTyCon :: TyCon
- symCoercionTyCon :: TyCon
- transCoercionTyCon :: TyCon
- leftCoercionTyCon :: TyCon
- rightCoercionTyCon :: TyCon
- instCoercionTyCon :: TyCon
- csel1CoercionTyCon :: TyCon
- csel2CoercionTyCon :: TyCon
- cselRCoercionTyCon :: TyCon
- decompLR_maybe :: (Type, Type) -> Maybe ((Type, Type), (Type, Type))
- decompCsel_maybe :: (Type, Type) -> Maybe ((Type, Type), (Type, Type), (Type, Type))
- decompInst_maybe :: (Type, Type) -> Maybe ((TyVar, TyVar), (Type, Type))
- splitCoPredTy_maybe :: Type -> Maybe (Type, Type, Type)
- splitNewTypeRepCo_maybe :: Type -> Maybe (Type, Coercion)
- instNewTyCon_maybe :: TyCon -> [Type] -> Maybe (Type, CoercionI)
- decomposeCo :: Arity -> Coercion -> [Coercion]
- coreEqCoercion :: Coercion -> Coercion -> Bool
- coreEqCoercion2 :: RnEnv2 -> Coercion -> Coercion -> Bool
- data CoercionI
- isIdentityCoI :: CoercionI -> Bool
- mkSymCoI :: CoercionI -> CoercionI
- mkTransCoI :: CoercionI -> CoercionI -> CoercionI
- mkTyConAppCoI :: TyCon -> [CoercionI] -> CoercionI
- mkAppTyCoI :: CoercionI -> CoercionI -> CoercionI
- mkFunTyCoI :: CoercionI -> CoercionI -> CoercionI
- mkForAllTyCoI :: TyVar -> CoercionI -> CoercionI
- fromCoI :: CoercionI -> Type
- mkClassPPredCoI :: Class -> [CoercionI] -> CoercionI
- mkIParamPredCoI :: IPName Name -> CoercionI -> CoercionI
- mkEqPredCoI :: CoercionI -> CoercionI -> CoercionI
- mkCoPredCoI :: CoercionI -> CoercionI -> CoercionI -> CoercionI
Main data type
The key type representing kinds in the compiler. Invariant: a kind is always in one of these forms:
FunTy k1 k2 TyConApp PrimTyCon [...] TyVar kv -- (during inference only) ForAll ... -- (for top-level coercions)
Deconstructing Kinds
kindFunResult :: Kind -> Kind
Essentially funResultTy on kinds
kindAppResult :: Kind -> [arg] -> Kind
synTyConResKind :: TyCon -> Kind
splitKindFunTys :: Kind -> ([Kind], Kind)
Essentially splitFunTys on kinds
splitKindFunTysN :: Int -> Kind -> ([Kind], Kind)
Essentially splitFunTysN on kinds
splitKindFunTy_maybe :: Kind -> Maybe (Kind, Kind)
Predicates on Kinds
isLiftedTypeKind :: Kind -> Bool
isUnliftedTypeKind :: Kind -> Bool
isOpenTypeKind :: Kind -> Bool
isUbxTupleKind :: Kind -> Bool
isArgTypeKind :: Kind -> Bool
isTySuperKind :: SuperKind -> Bool
isCoSuperKind :: SuperKind -> Bool
isSuperKind :: Type -> Bool
Is this a super-kind (i.e. a type-of-kinds)?
isCoercionKind :: Kind -> Bool
mkArrowKind :: Kind -> Kind -> Kind
Given two kinds k1 and k2, creates the Kind k1 -> k2
mkArrowKinds :: [Kind] -> Kind -> Kind
Iterated application of mkArrowKind
isSubArgTypeKind :: Kind -> Bool
True of any sub-kind of ArgTypeKind
isSubOpenTypeKind :: Kind -> Bool
True of any sub-kind of OpenTypeKind (i.e. anything except arrow)
defaultKind :: Kind -> Kind
Used when generalising: default kind ? and ?? to *. See Type for more information on what that means
isSubKindCon :: TyCon -> TyCon -> Bool
kc1 `isSubKindCon` kc2 checks that kc1 <: kc2
mkCoKind :: Type -> Type -> CoercionKind
Makes a CoercionKind from two types: the types whose equality
is proven by the relevant Coercion
mkCoPredTy :: Type -> Type -> Type -> Type
(mkCoPredTy s t r) produces the type: (s~t) => r
coVarKind_maybe :: CoVar -> Maybe (Type, Type)
coercionKind :: Coercion -> (Type, Type)
If it is the case that
c :: (t1 ~ t2)
i.e. the kind of c is a CoercionKind relating t1 and t2,
then coercionKind c = (t1, t2).
coercionKinds :: [Coercion] -> ([Type], [Type])
Apply coercionKind to multiple Coercions
isIdentityCoercion :: Coercion -> Bool
Equality predicates
getEqPredTys :: PredType -> (Type, Type)
Splits apart a type equality predicate, if the supplied PredType is one.
Panics otherwise
isEqPredTy :: Type -> Bool
Tests whether a type is just a type equality predicate
Coercion transformations
mkCoercion :: TyCon -> [Type] -> Coercion
mkSymCoercion :: Coercion -> Coercion
mkTransCoercion :: Coercion -> Coercion -> Coercion
mkLeftCoercion :: Coercion -> Coercion
mkRightCoercion :: Coercion -> Coercion
mkInstCoercion :: Coercion -> Type -> Coercion
mkAppCoercion :: Coercion -> Coercion -> Coercion
mkTyConCoercion :: TyCon -> [Coercion] -> Coercion
Apply a type constructor to a list of coercions.
mkFunCoercion :: Coercion -> Coercion -> Coercion
mkForAllCoercion :: Var -> Coercion -> Coercion
mkInstsCoercion :: Coercion -> [Type] -> Coercion
As mkInstCoercion, but instantiates the coercion with a number of type arguments, left-to-right
mkUnsafeCoercion :: Type -> Type -> Coercion
Manufacture a coercion from this air. Needless to say, this is not usually safe,
but it is used when we know we are dealing with bottom, which is one case in which
it is safe. This is also used implement the unsafeCoerce# primitive.
Optimise by pushing down through type constructors
Arguments
| :: Name | Unique name for the coercion tycon |
| -> [TyVar] | Type parameters of the coercion ( |
| -> TyCon | Family tycon ( |
| -> [Type] | Type instance ( |
| -> TyCon | Representation tycon ( |
| -> TyCon | Coercion tycon ( |
Create a coercion identifying a data, newtype or type representation type
and its family instance. It has the form Co tvs :: F ts ~ R tvs, where Co is
the coercion tycon built here, F the family tycon and R the (derived)
representation tycon.
mkAppsCoercion :: Coercion -> [Coercion] -> Coercion
Applies multiple Coercions to another Coercion, from left to right.
See also mkAppCoercion
mkCsel1Coercion :: Coercion -> Coercion
mkCsel2Coercion :: Coercion -> Coercion
mkCselRCoercion :: Coercion -> Coercion
mkClassPPredCo :: Class -> [Coercion] -> Coercion
mkIParamPredCo :: IPName Name -> Coercion -> Coercion
mkEqPredCo :: Coercion -> Coercion -> Coercion
mkCoVarCoercion :: CoVar -> Coercion
mkCoPredCo :: Coercion -> Coercion -> Coercion -> Coercion
Coercion type constructors: avoid using these directly and instead use
the mk*Coercion and split*Coercion family of functions if possible.
Each coercion TyCon is built with the special CoercionTyCon record and carries its own kinding rule. Such CoercionTyCons must be fully applied by any TyConApp in which they are applied, however they may also be over applied (see example above) and the kinding function must deal with this.
Decomposition
splitNewTypeRepCo_maybe :: Type -> Maybe (Type, Coercion)
Sometimes we want to look through a newtype and get its associated coercion.
This function only strips *one layer* of newtype off, so the caller will usually call
itself recursively. Furthermore, this function should only be applied to types of kind *,
hence the newtype is always saturated. If co : ty ~ ty' then:
splitNewTypeRepCo_maybe ty = Just (ty', co)
The function returns Nothing for non-newtypes or fully-transparent newtypes.
instNewTyCon_maybe :: TyCon -> [Type] -> Maybe (Type, CoercionI)
If co :: T ts ~ rep_ty then:
instNewTyCon_maybe T ts = Just (rep_ty, co)
decomposeCo :: Arity -> Coercion -> [Coercion]
Comparison
coreEqCoercion :: Coercion -> Coercion -> Bool
Determines syntactic equality of coercions
coreEqCoercion2 :: RnEnv2 -> Coercion -> Coercion -> Bool
CoercionI
data CoercionI
CoercionI represents a lifted ordinary Coercion, in that it
can represent either one of:
- A proper
Coercion - The identity coercion
Instances
isIdentityCoI :: CoercionI -> Bool
mkSymCoI :: CoercionI -> CoercionI
Smart constructor for sym on CoercionI, see also mkSymCoercion
mkTransCoI :: CoercionI -> CoercionI -> CoercionI
Smart constructor for trans on CoercionI, see also mkTransCoercion
mkTyConAppCoI :: TyCon -> [CoercionI] -> CoercionI
Smart constructor for type constructor application on CoercionI, see also mkAppCoercion
mkAppTyCoI :: CoercionI -> CoercionI -> CoercionI
Smart constructor for honest-to-god Coercion application on CoercionI, see also mkAppCoercion
mkFunTyCoI :: CoercionI -> CoercionI -> CoercionI
mkForAllTyCoI :: TyVar -> CoercionI -> CoercionI
Smart constructor for quantified Coercions on CoercionI, see also mkForAllCoercion
mkClassPPredCoI :: Class -> [CoercionI] -> CoercionI
mkIParamPredCoI :: IPName Name -> CoercionI -> CoercionI
Smart constructor for implicit parameter Coercions on CoercionI. Similar to mkClassPPredCoI
mkEqPredCoI :: CoercionI -> CoercionI -> CoercionI
Smart constructor for type equality Coercions on CoercionI. Similar to mkClassPPredCoI
mkCoPredCoI :: CoercionI -> CoercionI -> CoercionI -> CoercionI