ghc-8.0.0.20160111: The GHC API

Safe HaskellNone
LanguageHaskell2010

Coercion

Contents

Description

Module for (a) type kinds and (b) type coercions, as used in System FC. See Expr for more on System FC and how coercions fit into it.

Synopsis

Main data type

data Coercion

A Coercion is concrete evidence of the equality/convertibility of two types.

Instances

Data Coercion 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Coercion -> c Coercion Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Coercion Source

toConstr :: Coercion -> Constr Source

dataTypeOf :: Coercion -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c Coercion) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Coercion) Source

gmapT :: (forall b. Data b => b -> b) -> Coercion -> Coercion Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Coercion -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Coercion -> r Source

gmapQ :: (forall d. Data d => d -> u) -> Coercion -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> Coercion -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Coercion -> m Coercion Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Coercion -> m Coercion Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Coercion -> m Coercion Source

Outputable Coercion 

data UnivCoProvenance

For simplicity, we have just one UnivCo that represents a coercion from some type to some other type, with (in general) no restrictions on the type. The UnivCoProvenance specifies more exactly what the coercion really is and why a program should (or shouldn't!) trust the coercion. It is reasonable to consider each constructor of UnivCoProvenance as a totally independent coercion form; their only commonality is that they don't tell you what types they coercion between. (That info is in the UnivCo constructor of Coercion.

Instances

Data UnivCoProvenance 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> UnivCoProvenance -> c UnivCoProvenance Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c UnivCoProvenance Source

toConstr :: UnivCoProvenance -> Constr Source

dataTypeOf :: UnivCoProvenance -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c UnivCoProvenance) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c UnivCoProvenance) Source

gmapT :: (forall b. Data b => b -> b) -> UnivCoProvenance -> UnivCoProvenance Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> UnivCoProvenance -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> UnivCoProvenance -> r Source

gmapQ :: (forall d. Data d => d -> u) -> UnivCoProvenance -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> UnivCoProvenance -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> UnivCoProvenance -> m UnivCoProvenance Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> UnivCoProvenance -> m UnivCoProvenance Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> UnivCoProvenance -> m UnivCoProvenance Source

Outputable UnivCoProvenance 

data CoercionHole

A coercion to be filled in by the type-checker. See Note [Coercion holes]

Instances

Data CoercionHole 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> CoercionHole -> c CoercionHole Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c CoercionHole Source

toConstr :: CoercionHole -> Constr Source

dataTypeOf :: CoercionHole -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c CoercionHole) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c CoercionHole) Source

gmapT :: (forall b. Data b => b -> b) -> CoercionHole -> CoercionHole Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> CoercionHole -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> CoercionHole -> r Source

gmapQ :: (forall d. Data d => d -> u) -> CoercionHole -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> CoercionHole -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> CoercionHole -> m CoercionHole Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> CoercionHole -> m CoercionHole Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> CoercionHole -> m CoercionHole Source

Outputable CoercionHole 

data LeftOrRight

Constructors

CLeft 
CRight 

Instances

Eq LeftOrRight 
Data LeftOrRight 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> LeftOrRight -> c LeftOrRight Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c LeftOrRight Source

toConstr :: LeftOrRight -> Constr Source

dataTypeOf :: LeftOrRight -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c LeftOrRight) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LeftOrRight) Source

gmapT :: (forall b. Data b => b -> b) -> LeftOrRight -> LeftOrRight Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LeftOrRight -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LeftOrRight -> r Source

gmapQ :: (forall d. Data d => d -> u) -> LeftOrRight -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> LeftOrRight -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> LeftOrRight -> m LeftOrRight Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftOrRight -> m LeftOrRight Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftOrRight -> m LeftOrRight Source

Outputable LeftOrRight 
Binary LeftOrRight 

data Var

Essentially a typed Name, that may also contain some additional information about the Var and it's use sites.

Instances

Eq Var 

Methods

(==) :: Var -> Var -> Bool

(/=) :: Var -> Var -> Bool

Data Var 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Var -> c Var Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Var Source

toConstr :: Var -> Constr Source

dataTypeOf :: Var -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c Var) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Var) Source

gmapT :: (forall b. Data b => b -> b) -> Var -> Var Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Var -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Var -> r Source

gmapQ :: (forall d. Data d => d -> u) -> Var -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> Var -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Var -> m Var Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Var -> m Var Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Var -> m Var Source

Ord Var 

Methods

compare :: Var -> Var -> Ordering

(<) :: Var -> Var -> Bool

(<=) :: Var -> Var -> Bool

(>) :: Var -> Var -> Bool

(>=) :: Var -> Var -> Bool

max :: Var -> Var -> Var

min :: Var -> Var -> Var

Outputable Var 

Methods

ppr :: Var -> SDoc

pprPrec :: Rational -> Var -> SDoc

Uniquable Var 

Methods

getUnique :: Var -> Unique

NamedThing Var 

Methods

getOccName :: Var -> OccName

getName :: Var -> Name

type PostRn Id ty = ty 
type PostTc Id ty = ty 

type CoVar = Id

type TyCoVar = Id

data Role

Instances

Eq Role 

Methods

(==) :: Role -> Role -> Bool

(/=) :: Role -> Role -> Bool

Data Role 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Role -> c Role Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Role Source

toConstr :: Role -> Constr Source

dataTypeOf :: Role -> DataType Source

dataCast1 :: Typeable (TYPE Lifted -> TYPE Lifted) t => (forall d. Data d => c (t d)) -> Maybe (c Role) Source

dataCast2 :: Typeable (TYPE Lifted -> TYPE Lifted -> TYPE Lifted) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Role) Source

gmapT :: (forall b. Data b => b -> b) -> Role -> Role Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Role -> r Source

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Role -> r Source

gmapQ :: (forall d. Data d => d -> u) -> Role -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> Role -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Role -> m Role Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Role -> m Role Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Role -> m Role Source

Ord Role 

Methods

compare :: Role -> Role -> Ordering

(<) :: Role -> Role -> Bool

(<=) :: Role -> Role -> Bool

(>) :: Role -> Role -> Bool

(>=) :: Role -> Role -> Bool

max :: Role -> Role -> Role

min :: Role -> Role -> Role

Outputable Role 

Methods

ppr :: Role -> SDoc

pprPrec :: Rational -> Role -> SDoc

Binary Role 

Methods

put_ :: BinHandle -> Role -> IO ()

put :: BinHandle -> Role -> IO (Bin Role)

get :: BinHandle -> IO Role

ltRole :: Role -> Role -> Bool

Functions over coercions

coercionKind :: Coercion -> Pair Type

If it is the case that

c :: (t1 ~ t2)

i.e. the kind of c relates t1 and t2, then coercionKind c = Pair t1 t2.

coercionKinds :: [Coercion] -> Pair [Type]

Apply coercionKind to multiple Coercions

mkCoercionType :: Role -> Type -> Type -> Type

Makes a coercion type from two types: the types whose equality is proven by the relevant Coercion

coercionRole :: Coercion -> Role

Retrieve the role from a coercion.

coercionKindRole :: Coercion -> (Pair Type, Role)

Get a coercion's kind and role. Why both at once? See Note [Computing a coercion kind and role]

Constructing coercions

mkRepReflCo :: Type -> Coercion

Make a representational reflexive coercion

mkNomReflCo :: Type -> Coercion

Make a nominal reflexive coercion

mkAxInstLHS :: CoAxiom br -> BranchIndex -> [Type] -> [Coercion] -> Type

Return the left-hand type of the axiom, when the axiom is instantiated at the types given.

mkUnbranchedAxInstLHS :: CoAxiom Unbranched -> [Type] -> [Coercion] -> Type

Instantiate the left-hand side of an unbranched axiom

mkSymCo :: Coercion -> Coercion

Create a symmetric version of the given Coercion that asserts equality between the same types but in the other "direction", so a kind of t1 ~ t2 becomes the kind t2 ~ t1.

mkTransCo :: Coercion -> Coercion -> Coercion

Create a new Coercion by composing the two given Coercions transitively.

mkTransAppCo

Arguments

:: Role

r1

-> Coercion

co1 :: ty1a ~r1 ty1b

-> Type

ty1a

-> Type

ty1b

-> Role

r2

-> Coercion

co2 :: ty2a ~r2 ty2b

-> Type

ty2a

-> Type

ty2b

-> Role

r3

-> Coercion

:: ty1a ty2a ~r3 ty1b ty2b

Like mkAppCo, but allows the second coercion to be other than nominal. See Note [mkTransAppCo]. Role r3 cannot be more stringent than either r1 or r2.

mkInstCo :: Coercion -> Coercion -> Coercion

Instantiates a Coercion.

mkAppCo

Arguments

:: Coercion

:: t1 ~r t2

-> Coercion

:: s1 ~N s2, where s1 :: k1, s2 :: k2

-> Coercion

:: t1 s1 ~r t2 s2

Apply a Coercion to another Coercion. The second coercion must be Nominal, unless the first is Phantom. If the first is Phantom, then the second can be either Phantom or Nominal.

mkAppCos :: Coercion -> [Coercion] -> Coercion

Applies multiple Coercions to another Coercion, from left to right. See also mkAppCo.

mkTyConAppCo :: Role -> TyCon -> [Coercion] -> Coercion

Apply a type constructor to a list of coercions. It is the caller's responsibility to get the roles correct on argument coercions.

mkFunCo :: Role -> Coercion -> Coercion -> Coercion

Make a function Coercion between two other Coercions

mkFunCos :: Role -> [Coercion] -> Coercion -> Coercion

Make nested function Coercions

mkForAllCo :: TyVar -> Coercion -> Coercion -> Coercion

Make a Coercion from a tyvar, a kind coercion, and a body coercion. The kind of the tyvar should be the left-hand kind of the kind coercion.

mkForAllCos :: [(TyVar, Coercion)] -> Coercion -> Coercion

Make nested ForAllCos

mkHomoForAllCos :: [TyVar] -> Coercion -> Coercion

Make a Coercion quantified over a type variable; the variable has the same type in both sides of the coercion

mkHomoForAllCos_NoRefl :: [TyVar] -> Coercion -> Coercion

Like mkHomoForAllCos, but doesn't check if the inner coercion is reflexive.

mkPhantomCo :: Coercion -> Type -> Type -> Coercion

Make a phantom coercion between two types. The coercion passed in must be a nominal coercion between the kinds of the types.

mkHomoPhantomCo :: Type -> Type -> Coercion

Make a phantom coercion between two types of the same kind.

mkUnsafeCo :: Role -> Type -> Type -> Coercion

Manufacture an unsafe coercion from thin air. Currently (May 14) this is used only to implement the unsafeCoerce# primitive. Optimise by pushing down through type constructors.

mkHoleCo :: CoercionHole -> Role -> Type -> Type -> Coercion

Make a coercion from a coercion hole

mkUnivCo

Arguments

:: UnivCoProvenance 
-> Role

role of the built coercion, "r"

-> Type

t1 :: k1

-> Type

t2 :: k2

-> Coercion

:: t1 ~r t2

Make a universal coercion between two arbitrary types.

mkProofIrrelCo

Arguments

:: Role

role of the created coercion, "r"

-> Coercion

:: phi1 ~N phi2

-> Coercion

g1 :: phi1

-> Coercion

g2 :: phi2

-> Coercion

:: g1 ~r g2

Make a "coercion between coercions".

downgradeRole :: Role -> Role -> Coercion -> Coercion

Like downgradeRole_maybe, but panics if the change isn't a downgrade. See Note [Role twiddling functions]

maybeSubCo :: EqRel -> Coercion -> Coercion

If the EqRel is ReprEq, makes a SubCo; otherwise, does nothing. Note that the input coercion should always be nominal.

mkCoherenceRightCo :: Coercion -> Coercion -> Coercion infixl 5

A CoherenceCo c1 c2 applies the coercion c2 to the left-hand type in the kind of c1. This function uses sym to get the coercion on the right-hand type of c1. Thus, if c1 :: s ~ t, then mkCoherenceRightCo c1 c2 has the kind (s ~ (t |> c2)) down through type constructors. The second coercion must be representational.

mkCoherenceLeftCo :: Coercion -> Coercion -> Coercion infixl 5

An explictly directed synonym of mkCoherenceCo. The second coercion must be representational.

castCoercionKind :: Coercion -> Coercion -> Coercion -> Coercion

Creates a new coercion with both of its types casted by different casts castCoercionKind g h1 h2, where g :: t1 ~ t2, has type (t1 |> h1) ~ (t2 |> h2) The second and third coercions must be nominal.

Decomposition

instNewTyCon_maybe :: TyCon -> [Type] -> Maybe (Type, Coercion)

If co :: T ts ~ rep_ty then:

instNewTyCon_maybe T ts = Just (rep_ty, co)

Checks for a newtype, and for being saturated

type NormaliseStepper = RecTcChecker -> TyCon -> [Type] -> NormaliseStepResult

A function to check if we can reduce a type by one step. Used with topNormaliseTypeX_maybe.

data NormaliseStepResult

The result of stepping in a normalisation function. See topNormaliseTypeX_maybe.

Constructors

NS_Done

Nothing more to do

NS_Abort

Utter failure. The outer function should fail too.

NS_Step RecTcChecker Type Coercion

We stepped, yielding new bits; ^ co :: old type ~ new type

composeSteppers :: NormaliseStepper -> NormaliseStepper -> NormaliseStepper

Try one stepper and then try the next, if the first doesn't make progress. So if it returns NS_Done, it means that both steppers are satisfied

unwrapNewTypeStepper :: NormaliseStepper

A NormaliseStepper that unwraps newtypes, careful not to fall into a loop. If it would fall into a loop, it produces NS_Abort.

topNormaliseNewType_maybe :: Type -> Maybe (Coercion, Type)

Sometimes we want to look through a newtype and get its associated coercion. This function strips off newtype layers enough to reveal something that isn't a newtype. Specifically, here's the invariant:

topNormaliseNewType_maybe rec_nts ty = Just (co, ty')

then (a) co : ty0 ~ ty'. (b) ty' is not a newtype.

The function returns Nothing for non-newtypes, or unsaturated applications

This function does *not* look through type families, because it has no access to the type family environment. If you do have that at hand, consider to use topNormaliseType_maybe, which should be a drop-in replacement for topNormaliseNewType_maybe

topNormaliseTypeX_maybe :: NormaliseStepper -> Type -> Maybe (Coercion, Type)

A general function for normalising the top-level of a type. It continues to use the provided NormaliseStepper until that function fails, and then this function returns. The roles of the coercions produced by the NormaliseStepper must all be the same, which is the role returned from the call to topNormaliseTypeX_maybe.

decomposeCo :: Arity -> Coercion -> [Coercion]

This breaks a Coercion with type T A B C ~ T D E F into a list of Coercions of kinds A ~ D, B ~ E and E ~ F. Hence:

decomposeCo 3 c = [nth 0 c, nth 1 c, nth 2 c]

getCoVar_maybe :: Coercion -> Maybe CoVar

Attempts to obtain the type variable underlying a Coercion

splitTyConAppCo_maybe :: Coercion -> Maybe (TyCon, [Coercion])

Attempts to tease a coercion apart into a type constructor and the application of a number of coercion arguments to that constructor

splitAppCo_maybe :: Coercion -> Maybe (Coercion, Coercion)

Attempt to take a coercion application apart.

nthRole :: Role -> TyCon -> Int -> Role

setNominalRole_maybe :: Coercion -> Maybe Coercion

Converts a coercion to be nominal, if possible. See Note [Role twiddling functions]

pickLR :: LeftOrRight -> (a, a) -> a

isReflCo :: Coercion -> Bool

Tests if this coercion is obviously reflexive. Guaranteed to work very quickly. Sometimes a coercion can be reflexive, but not obviously so. c.f. isReflexiveCo

isReflCo_maybe :: Coercion -> Maybe (Type, Role)

Returns the type coerced if this coercion is reflexive. Guaranteed to work very quickly. Sometimes a coercion can be reflexive, but not obviously so. c.f. isReflexiveCo_maybe

isReflexiveCo :: Coercion -> Bool

Slowly checks if the coercion is reflexive. Don't call this in a loop, as it walks over the entire coercion.

isReflexiveCo_maybe :: Coercion -> Maybe (Type, Role)

Extracts the coerced type from a reflexive coercion. This potentially walks over the entire coercion, so avoid doing this in a loop.

Coercion variables

isCoVar_maybe :: Coercion -> Maybe CoVar

Extract a covar, if possible. This check is dirty. Be ashamed of yourself. (It's dirty because it cares about the structure of a coercion, which is morally reprehensible.)

Free variables

tyCoVarsOfCoDSet :: Coercion -> DTyCoVarSet

Get a deterministic set of the vars free in a coercion

Substitution

type CvSubstEnv = CoVarEnv Coercion

A substitution of Coercions for CoVars

substCo :: TCvSubst -> Coercion -> Coercion

Substitute within a Coercion

substCos :: TCvSubst -> [Coercion] -> [Coercion]

Substitute within several Coercions

substCoWith :: [TyVar] -> [Type] -> Coercion -> Coercion

Coercion substitution making use of an TCvSubst that is assumed to be open, see zipOpenTCvSubst

Lifting

liftCoSubst :: Role -> LiftingContext -> Type -> Coercion

liftCoSubst role lc ty produces a coercion (at role role) that coerces between lc_left(ty) and lc_right(ty), where lc_left is a substitution mapping type variables to the left-hand types of the mapped coercions in lc, and similar for lc_right.

liftCoSubstWithEx :: Role -> [TyVar] -> [Coercion] -> [TyVar] -> [Type] -> (Type -> Coercion, [Type])

extendLiftingContext

Arguments

:: LiftingContext

original LC

-> TyVar

new variable to map...

-> Coercion

...to this lifted version

-> LiftingContext 

Extend a lifting context with a new type mapping.

isMappedByLC :: TyCoVar -> LiftingContext -> Bool

Is a var in the domain of a lifting context?

zapLiftingContext :: LiftingContext -> LiftingContext

Erase the environments in a lifting context

substForAllCoBndrCallbackLC :: Bool -> (Coercion -> Coercion) -> LiftingContext -> TyVar -> Coercion -> (LiftingContext, TyVar, Coercion)

Like substForAllCoBndr, but works on a lifting context

lcTCvSubst :: LiftingContext -> TCvSubst

Extract the underlying substitution from the LiftingContext

swapLiftCoEnv :: LiftCoEnv -> LiftCoEnv

Apply "sym" to all coercions in a LiftCoEnv

Comparison

eqCoercion :: Coercion -> Coercion -> Bool

Syntactic equality of coercions

eqCoercionX :: RnEnv2 -> Coercion -> Coercion -> Bool

Compare two Coercions, with respect to an RnEnv2

Forcing evaluation of coercions

seqCo :: Coercion -> ()

Pretty-printing

Tidying

Other

promoteCoercion :: Coercion -> Coercion

like mkKindCo, but aggressively & recursively optimizes to avoid using a KindCo constructor. The output role is nominal.