Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-release > by-pkgid > 6e204a966e8c42d976f99a1700ce5f20 > files > 2827

ghc-7.4.2-4.mga5.i586.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Coercion</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
window.onload = function () {pageLoad();setSynopsis("mini_Coercion.html");};
//]]>
</script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">ghc-7.4.2: The GHC API</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Safe Haskell</th><td>None</td></tr></table><p class="caption">Coercion</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Main data type
</a><ul><li><a href="#g:2">Functions over coercions
</a></li><li><a href="#g:3">Constructing coercions
</a></li><li><a href="#g:4">Decomposition
</a></li><li><a href="#g:5">Coercion variables
</a></li><li><a href="#g:6">Free variables
</a></li><li><a href="#g:7">Substitution
</a></li><li><a href="#g:8">Lifting
</a></li><li><a href="#g:9">Comparison
</a></li><li><a href="#g:10">Forcing evaluation of coercions
</a></li></ul></li><li><a href="#g:11">Pretty-printing
</a></li><li><a href="#g:12">Other
</a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Module for (a) type kinds and (b) type coercions, 
 as used in System FC. See <code><a href="CoreSyn.html#t:Expr">Expr</a></code> for
 more on System FC and how coercions fit into it.
</p></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">data</span>  <a href="#t:Coercion">Coercion</a> <ul class="subs"><li>= <a href="#v:Refl">Refl</a> <a href="Type.html#t:Type">Type</a>  </li><li>| <a href="#v:TyConAppCo">TyConAppCo</a> <a href="TyCon.html#t:TyCon">TyCon</a> [<a href="Coercion.html#t:Coercion">Coercion</a>]  </li><li>| <a href="#v:AppCo">AppCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Coercion.html#t:Coercion">Coercion</a>  </li><li>| <a href="#v:ForAllCo">ForAllCo</a> <a href="Var.html#t:TyVar">TyVar</a> <a href="Coercion.html#t:Coercion">Coercion</a>  </li><li>| <a href="#v:CoVarCo">CoVarCo</a> <a href="Coercion.html#t:CoVar">CoVar</a>  </li><li>| <a href="#v:AxiomInstCo">AxiomInstCo</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a> [<a href="Coercion.html#t:Coercion">Coercion</a>]  </li><li>| <a href="#v:UnsafeCo">UnsafeCo</a> <a href="Type.html#t:Type">Type</a> <a href="Type.html#t:Type">Type</a>  </li><li>| <a href="#v:SymCo">SymCo</a> <a href="Coercion.html#t:Coercion">Coercion</a>  </li><li>| <a href="#v:TransCo">TransCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Coercion.html#t:Coercion">Coercion</a>  </li><li>| <a href="#v:NthCo">NthCo</a> <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> <a href="Coercion.html#t:Coercion">Coercion</a>  </li><li>| <a href="#v:InstCo">InstCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Type.html#t:Type">Type</a>  </li></ul></li><li class="src short"><span class="keyword">data</span>  <a href="#t:Var">Var</a> </li><li class="src short"><span class="keyword">type</span> <a href="#t:CoVar">CoVar</a> = <a href="Var.html#t:Id">Id</a></li><li class="src short"><a href="#v:coVarKind">coVarKind</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; (<a href="Type.html#t:Type">Type</a>, <a href="Type.html#t:Type">Type</a>)</li><li class="src short"><a href="#v:coercionType">coercionType</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:coercionKind">coercionKind</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Pair.html#t:Pair">Pair</a> <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:coercionKinds">coercionKinds</a> :: [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Pair.html#t:Pair">Pair</a> [<a href="Type.html#t:Type">Type</a>]</li><li class="src short"><a href="#v:isReflCo">isReflCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isReflCo_maybe">isReflCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:mkCoercionType">mkCoercionType</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:mkReflCo">mkReflCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkCoVarCo">mkCoVarCo</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkAxInstCo">mkAxInstCo</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkPiCo">mkPiCo</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkPiCos">mkPiCos</a> :: [<a href="Coercion.html#t:Var">Var</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkSymCo">mkSymCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkTransCo">mkTransCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkNthCo">mkNthCo</a> :: <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkInstCo">mkInstCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkAppCo">mkAppCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkTyConAppCo">mkTyConAppCo</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkFunCo">mkFunCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkForAllCo">mkForAllCo</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkUnsafeCo">mkUnsafeCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:mkNewTypeCo">mkNewTypeCo</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="TyCon.html#t:CoAxiom">CoAxiom</a></li><li class="src short"><a href="#v:mkFamInstCo">mkFamInstCo</a> :: <a href="Name.html#t:Name">Name</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:CoAxiom">CoAxiom</a></li><li class="src short"><a href="#v:splitNewTypeRepCo_maybe">splitNewTypeRepCo_maybe</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Type.html#t:Type">Type</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</li><li class="src short"><a href="#v:instNewTyCon_maybe">instNewTyCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Type.html#t:Type">Type</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</li><li class="src short"><a href="#v:decomposeCo">decomposeCo</a> :: <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</li><li class="src short"><a href="#v:getCoVar_maybe">getCoVar_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:CoVar">CoVar</a></li><li class="src short"><a href="#v:splitTyConAppCo_maybe">splitTyConAppCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="TyCon.html#t:TyCon">TyCon</a>, [<a href="Coercion.html#t:Coercion">Coercion</a>])</li><li class="src short"><a href="#v:splitAppCo_maybe">splitAppCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Coercion.html#t:Coercion">Coercion</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</li><li class="src short"><a href="#v:splitForAllCo_maybe">splitForAllCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Var.html#t:TyVar">TyVar</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</li><li class="src short"><a href="#v:mkCoVar">mkCoVar</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></li><li class="src short"><a href="#v:isCoVar">isCoVar</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isCoVarType">isCoVarType</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:coVarName">coVarName</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Name.html#t:Name">Name</a></li><li class="src short"><a href="#v:setCoVarName">setCoVarName</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Name.html#t:Name">Name</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></li><li class="src short"><a href="#v:setCoVarUnique">setCoVarUnique</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Unique.html#t:Unique">Unique</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></li><li class="src short"><a href="#v:tyCoVarsOfCo">tyCoVarsOfCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></li><li class="src short"><a href="#v:tyCoVarsOfCos">tyCoVarsOfCos</a> :: [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></li><li class="src short"><a href="#v:coVarsOfCo">coVarsOfCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></li><li class="src short"><a href="#v:coercionSize">coercionSize</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></li><li class="src short"><span class="keyword">type</span> <a href="#t:CvSubstEnv">CvSubstEnv</a> = <a href="VarEnv.html#t:VarEnv">VarEnv</a> <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:emptyCvSubstEnv">emptyCvSubstEnv</a> :: <a href="Coercion.html#t:CvSubstEnv">CvSubstEnv</a></li><li class="src short"><span class="keyword">data</span>  <a href="#t:CvSubst">CvSubst</a>  = <a href="#v:CvSubst">CvSubst</a> <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> <a href="Type.html#t:TvSubstEnv">TvSubstEnv</a> <a href="Coercion.html#t:CvSubstEnv">CvSubstEnv</a></li><li class="src short"><a href="#v:emptyCvSubst">emptyCvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:lookupTyVar">lookupTyVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:lookupCoVar">lookupCoVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:isEmptyCvSubst">isEmptyCvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:zapCvSubstEnv">zapCvSubstEnv</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:getCvInScope">getCvInScope</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="VarEnv.html#t:InScopeSet">InScopeSet</a></li><li class="src short"><a href="#v:substCo">substCo</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:substCos">substCos</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</li><li class="src short"><a href="#v:substCoVar">substCoVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:substCoVars">substCoVars</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; [<a href="Coercion.html#t:CoVar">CoVar</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</li><li class="src short"><a href="#v:substCoWithTy">substCoWithTy</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:substCoWithTys">substCoWithTys</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:cvTvSubst">cvTvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Type.html#t:TvSubst">TvSubst</a></li><li class="src short"><a href="#v:tvCvSubst">tvCvSubst</a> :: <a href="Type.html#t:TvSubst">TvSubst</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:mkCvSubst">mkCvSubst</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; [(<a href="Coercion.html#t:Var">Var</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)] -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:zipOpenCvSubst">zipOpenCvSubst</a> :: [<a href="Coercion.html#t:Var">Var</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:substTy">substTy</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:extendTvSubst">extendTvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:extendCvSubstAndInScope">extendCvSubstAndInScope</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></li><li class="src short"><a href="#v:substTyVarBndr">substTyVarBndr</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; (<a href="Coercion.html#t:CvSubst">CvSubst</a>, <a href="Var.html#t:TyVar">TyVar</a>)</li><li class="src short"><a href="#v:substCoVarBndr">substCoVarBndr</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; (<a href="Coercion.html#t:CvSubst">CvSubst</a>, <a href="Coercion.html#t:CoVar">CoVar</a>)</li><li class="src short"><a href="#v:liftCoMatch">liftCoMatch</a> :: <a href="VarSet.html#t:TyVarSet">TyVarSet</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> LiftCoSubst</li><li class="src short"><a href="#v:liftCoSubstTyVar">liftCoSubstTyVar</a> :: LiftCoSubst -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:liftCoSubstWith">liftCoSubstWith</a> :: [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></li><li class="src short"><a href="#v:coreEqCoercion">coreEqCoercion</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:coreEqCoercion2">coreEqCoercion2</a> :: <a href="VarEnv.html#t:RnEnv2">RnEnv2</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:seqCo">seqCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; ()</li><li class="src short"><a href="#v:pprCo">pprCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:pprParendCo">pprParendCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:pprCoAxiom">pprCoAxiom</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></li><li class="src short"><a href="#v:applyCo">applyCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a></li></ul></div><div id="interface"><h1 id="g:1">Main data type
</h1><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:Coercion" class="def">Coercion</a>  </p><div class="doc"><p>A <code><a href="Coercion.html#t:Coercion">Coercion</a></code> is concrete evidence of the equality/convertibility
 of two types.
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Refl" class="def">Refl</a> <a href="Type.html#t:Type">Type</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:TyConAppCo" class="def">TyConAppCo</a> <a href="TyCon.html#t:TyCon">TyCon</a> [<a href="Coercion.html#t:Coercion">Coercion</a>]</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:AppCo" class="def">AppCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:ForAllCo" class="def">ForAllCo</a> <a href="Var.html#t:TyVar">TyVar</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:CoVarCo" class="def">CoVarCo</a> <a href="Coercion.html#t:CoVar">CoVar</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:AxiomInstCo" class="def">AxiomInstCo</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a> [<a href="Coercion.html#t:Coercion">Coercion</a>]</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:UnsafeCo" class="def">UnsafeCo</a> <a href="Type.html#t:Type">Type</a> <a href="Type.html#t:Type">Type</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:SymCo" class="def">SymCo</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:TransCo" class="def">TransCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:NthCo" class="def">NthCo</a> <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:InstCo" class="def">InstCo</a> <a href="Coercion.html#t:Coercion">Coercion</a> <a href="Type.html#t:Type">Type</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="subs instances"><p id="control.i:Coercion" class="caption collapser" onclick="toggleSection('i:Coercion')">Instances</p><div id="section.i:Coercion" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Data.html#t:Data">Data</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="../base-4.5.1.0/Data-Typeable-Internal.html#t:Typeable">Typeable</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="Coercion.html#t:Coercion">Coercion</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:Var" class="def">Var</a>  </p><div class="doc"><p>Essentially a typed <code><a href="Name.html#t:Name">Name</a></code>, that may also contain some additional information
 about the <code><a href="Coercion.html#t:Var">Var</a></code> and it's use sites.
</p></div><div class="subs instances"><p id="control.i:Var" class="caption collapser" onclick="toggleSection('i:Var')">Instances</p><div id="section.i:Var" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="../base-4.5.1.0/Data-Data.html#t:Data">Data</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="../base-4.5.1.0/Data-Ord.html#t:Ord">Ord</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="../base-4.5.1.0/Text-Show.html#t:Show">Show</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="../base-4.5.1.0/Data-Typeable-Internal.html#t:Typeable">Typeable</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:OutputableBndr">OutputableBndr</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Unique.html#t:Uniquable">Uniquable</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Name.html#t:NamedThing">NamedThing</a> <a href="Coercion.html#t:Var">Var</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:CoVar" class="def">CoVar</a> = <a href="Var.html#t:Id">Id</a></p></div><h2 id="g:2">Functions over coercions
</h2><div class="top"><p class="src"><a name="v:coVarKind" class="def">coVarKind</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; (<a href="Type.html#t:Type">Type</a>, <a href="Type.html#t:Type">Type</a>)</p></div><div class="top"><p class="src"><a name="v:coercionType" class="def">coercionType</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a></p></div><div class="top"><p class="src"><a name="v:coercionKind" class="def">coercionKind</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Pair.html#t:Pair">Pair</a> <a href="Type.html#t:Type">Type</a></p><div class="doc"><p>If it is the case that
</p><pre> c :: (t1 ~ t2)
</pre><p>i.e. the kind of <code>c</code> relates <code>t1</code> and <code>t2</code>, then <code>coercionKind c = Pair t1 t2</code>.
</p></div></div><div class="top"><p class="src"><a name="v:coercionKinds" class="def">coercionKinds</a> :: [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Pair.html#t:Pair">Pair</a> [<a href="Type.html#t:Type">Type</a>]</p><div class="doc"><p>Apply <code><a href="Coercion.html#v:coercionKind">coercionKind</a></code> to multiple <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s
</p></div></div><div class="top"><p class="src"><a name="v:isReflCo" class="def">isReflCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:isReflCo_maybe" class="def">isReflCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Type.html#t:Type">Type</a></p></div><div class="top"><p class="src"><a name="v:mkCoercionType" class="def">mkCoercionType</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a></p><div class="doc"><p>Makes a coercion type from two types: the types whose equality 
 is proven by the relevant <code><a href="Coercion.html#t:Coercion">Coercion</a></code>
</p></div></div><h2 id="g:3">Constructing coercions
</h2><div class="top"><p class="src"><a name="v:mkReflCo" class="def">mkReflCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkCoVarCo" class="def">mkCoVarCo</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkAxInstCo" class="def">mkAxInstCo</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkPiCo" class="def">mkPiCo</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkPiCos" class="def">mkPiCos</a> :: [<a href="Coercion.html#t:Var">Var</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkSymCo" class="def">mkSymCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Create a symmetric version of the given <code><a href="Coercion.html#t:Coercion">Coercion</a></code> that asserts
   equality between the same types but in the other <a href="direction.html">direction</a>, so
   a kind of <code>t1 ~ t2</code> becomes the kind <code>t2 ~ t1</code>.
</p></div></div><div class="top"><p class="src"><a name="v:mkTransCo" class="def">mkTransCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Create a new <code><a href="Coercion.html#t:Coercion">Coercion</a></code> by composing the two given <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s transitively.
</p></div></div><div class="top"><p class="src"><a name="v:mkNthCo" class="def">mkNthCo</a> :: <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:mkInstCo" class="def">mkInstCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Instantiates a <code><a href="Coercion.html#t:Coercion">Coercion</a></code> with a <code><a href="Type.html#t:Type">Type</a></code> argument. 
</p></div></div><div class="top"><p class="src"><a name="v:mkAppCo" class="def">mkAppCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Apply a <code><a href="Coercion.html#t:Coercion">Coercion</a></code> to another <code><a href="Coercion.html#t:Coercion">Coercion</a></code>.
</p></div></div><div class="top"><p class="src"><a name="v:mkTyConAppCo" class="def">mkTyConAppCo</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Apply a type constructor to a list of coercions.
</p></div></div><div class="top"><p class="src"><a name="v:mkFunCo" class="def">mkFunCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Make a function <code><a href="Coercion.html#t:Coercion">Coercion</a></code> between two other <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s
</p></div></div><div class="top"><p class="src"><a name="v:mkForAllCo" class="def">mkForAllCo</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Make a <code><a href="Coercion.html#t:Coercion">Coercion</a></code> which binds a variable within an inner <code><a href="Coercion.html#t:Coercion">Coercion</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:mkUnsafeCo" class="def">mkUnsafeCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Manufacture a coercion from thin 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
   to implement the <code>unsafeCoerce#</code> primitive.  Optimise by pushing
   down through type constructors.
</p></div></div><div class="top"><p class="src"><a name="v:mkNewTypeCo" class="def">mkNewTypeCo</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="TyCon.html#t:CoAxiom">CoAxiom</a></p><div class="doc"><p>Create a coercion constructor (axiom) suitable for the given
   newtype <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. The <code><a href="Name.html#t:Name">Name</a></code> should be that of a new coercion
   <code><a href="TyCon.html#t:CoAxiom">CoAxiom</a></code>, the <code><a href="Var.html#t:TyVar">TyVar</a></code>s the arguments expected by the <code>newtype</code> and
   the type the appropriate right hand side of the <code>newtype</code>, with
   the free variables a subset of those <code><a href="Var.html#t:TyVar">TyVar</a></code>s.
</p></div></div><div class="top"><p class="src"><a name="v:mkFamInstCo" class="def">mkFamInstCo</a></p><div class="subs arguments"><p class="caption">Arguments</p><table><tr><td class="src">:: <a href="Name.html#t:Name">Name</a></td><td class="doc"><p>Unique name for the coercion tycon
</p></td></tr><tr><td class="src">-&gt; [<a href="Var.html#t:TyVar">TyVar</a>]</td><td class="doc"><p>Type parameters of the coercion (<code>tvs</code>)
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc"><p>Family tycon (<code>F</code>)
</p></td></tr><tr><td class="src">-&gt; [<a href="Type.html#t:Type">Type</a>]</td><td class="doc"><p>Type instance (<code>ts</code>)
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc"><p>Representation tycon (<code>R</code>)
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc"><p>Coercion constructor (<code>Co</code>)
</p></td></tr></table></div><div class="doc"><p>Create a coercion identifying a <code>data</code>, <code>newtype</code> or <code>type</code> representation type
 and its family instance.  It has the form <code>Co tvs :: F ts ~ R tvs</code>, where <code>Co</code> is 
 the coercion constructor built here, <code>F</code> the family tycon and <code>R</code> the (derived)
 representation tycon.
</p></div></div><h2 id="g:4">Decomposition
</h2><div class="top"><p class="src"><a name="v:splitNewTypeRepCo_maybe" class="def">splitNewTypeRepCo_maybe</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Type.html#t:Type">Type</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</p><div class="doc"><p>Sometimes we want to look through a <code>newtype</code> and get its associated coercion.
 This function only strips *one layer* of <code>newtype</code> off, so the caller will usually call
 itself recursively. Furthermore, this function should only be applied to types of kind <code>*</code>,
 hence the newtype is always saturated. If <code>co : ty ~ ty'</code> then:
</p><pre> splitNewTypeRepCo_maybe ty = Just (ty', co)
</pre><p>The function returns <code>Nothing</code> for non-<code>newtypes</code> or fully-transparent <code>newtype</code>s.
</p></div></div><div class="top"><p class="src"><a name="v:instNewTyCon_maybe" class="def">instNewTyCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Type.html#t:Type">Type</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</p><div class="doc"><p>If <code>co :: T ts ~ rep_ty</code> then:
</p><pre> instNewTyCon_maybe T ts = Just (rep_ty, co)
</pre></div></div><div class="top"><p class="src"><a name="v:decomposeCo" class="def">decomposeCo</a> :: <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</p><div class="doc"><p>This breaks a <code><a href="Coercion.html#t:Coercion">Coercion</a></code> with type <code>T A B C ~ T D E F</code> into
 a list of <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s of kinds <code>A ~ D</code>, <code>B ~ E</code> and <code>E ~ F</code>. Hence:
</p><pre> decomposeCo 3 c = [nth 0 c, nth 1 c, nth 2 c]
</pre></div></div><div class="top"><p class="src"><a name="v:getCoVar_maybe" class="def">getCoVar_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:CoVar">CoVar</a></p><div class="doc"><p>Attempts to obtain the type variable underlying a <code><a href="Coercion.html#t:Coercion">Coercion</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:splitTyConAppCo_maybe" class="def">splitTyConAppCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="TyCon.html#t:TyCon">TyCon</a>, [<a href="Coercion.html#t:Coercion">Coercion</a>])</p><div class="doc"><p>Attempts to tease a coercion apart into a type constructor and the application
 of a number of coercion arguments to that constructor
</p></div></div><div class="top"><p class="src"><a name="v:splitAppCo_maybe" class="def">splitAppCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Coercion.html#t:Coercion">Coercion</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</p><div class="doc"><p>Attempt to take a coercion application apart.
</p></div></div><div class="top"><p class="src"><a name="v:splitForAllCo_maybe" class="def">splitForAllCo_maybe</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="Var.html#t:TyVar">TyVar</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)</p></div><h2 id="g:5">Coercion variables
</h2><div class="top"><p class="src"><a name="v:mkCoVar" class="def">mkCoVar</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></p></div><div class="top"><p class="src"><a name="v:isCoVar" class="def">isCoVar</a> :: <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:isCoVarType" class="def">isCoVarType</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:coVarName" class="def">coVarName</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Name.html#t:Name">Name</a></p></div><div class="top"><p class="src"><a name="v:setCoVarName" class="def">setCoVarName</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Name.html#t:Name">Name</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></p></div><div class="top"><p class="src"><a name="v:setCoVarUnique" class="def">setCoVarUnique</a> :: <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Unique.html#t:Unique">Unique</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a></p></div><h2 id="g:6">Free variables
</h2><div class="top"><p class="src"><a name="v:tyCoVarsOfCo" class="def">tyCoVarsOfCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></p></div><div class="top"><p class="src"><a name="v:tyCoVarsOfCos" class="def">tyCoVarsOfCos</a> :: [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></p></div><div class="top"><p class="src"><a name="v:coVarsOfCo" class="def">coVarsOfCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="VarSet.html#t:VarSet">VarSet</a></p></div><div class="top"><p class="src"><a name="v:coercionSize" class="def">coercionSize</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></p></div><h2 id="g:7">Substitution
</h2><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:CvSubstEnv" class="def">CvSubstEnv</a> = <a href="VarEnv.html#t:VarEnv">VarEnv</a> <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>A substitution of <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s for <code><a href="Coercion.html#t:CoVar">CoVar</a></code>s (OR <code><a href="Var.html#t:TyVar">TyVar</a></code>s, when
   doing a &quot;lifting&quot; substitution)
</p></div></div><div class="top"><p class="src"><a name="v:emptyCvSubstEnv" class="def">emptyCvSubstEnv</a> :: <a href="Coercion.html#t:CvSubstEnv">CvSubstEnv</a></p></div><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:CvSubst" class="def">CvSubst</a>  </p><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:CvSubst" class="def">CvSubst</a> <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> <a href="Type.html#t:TvSubstEnv">TvSubstEnv</a> <a href="Coercion.html#t:CvSubstEnv">CvSubstEnv</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="subs instances"><p id="control.i:CvSubst" class="caption collapser" onclick="toggleSection('i:CvSubst')">Instances</p><div id="section.i:CvSubst" class="show"><table><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="Coercion.html#t:CvSubst">CvSubst</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:emptyCvSubst" class="def">emptyCvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:lookupTyVar" class="def">lookupTyVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Type.html#t:Type">Type</a></p></div><div class="top"><p class="src"><a name="v:lookupCoVar" class="def">lookupCoVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:Var">Var</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:isEmptyCvSubst" class="def">isEmptyCvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><a name="v:zapCvSubstEnv" class="def">zapCvSubstEnv</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:getCvInScope" class="def">getCvInScope</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="VarEnv.html#t:InScopeSet">InScopeSet</a></p></div><div class="top"><p class="src"><a name="v:substCo" class="def">substCo</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p><div class="doc"><p>Substitute within a <code><a href="Coercion.html#t:Coercion">Coercion</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:substCos" class="def">substCos</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</p><div class="doc"><p>Substitute within several <code><a href="Coercion.html#t:Coercion">Coercion</a></code>s
</p></div></div><div class="top"><p class="src"><a name="v:substCoVar" class="def">substCoVar</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:substCoVars" class="def">substCoVars</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; [<a href="Coercion.html#t:CoVar">CoVar</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>]</p></div><div class="top"><p class="src"><a name="v:substCoWithTy" class="def">substCoWithTy</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:substCoWithTys" class="def">substCoWithTys</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; [<a href="Type.html#t:Type">Type</a>] -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:cvTvSubst" class="def">cvTvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Type.html#t:TvSubst">TvSubst</a></p></div><div class="top"><p class="src"><a name="v:tvCvSubst" class="def">tvCvSubst</a> :: <a href="Type.html#t:TvSubst">TvSubst</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:mkCvSubst" class="def">mkCvSubst</a> :: <a href="VarEnv.html#t:InScopeSet">InScopeSet</a> -&gt; [(<a href="Coercion.html#t:Var">Var</a>, <a href="Coercion.html#t:Coercion">Coercion</a>)] -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:zipOpenCvSubst" class="def">zipOpenCvSubst</a> :: [<a href="Coercion.html#t:Var">Var</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:substTy" class="def">substTy</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Type.html#t:Type">Type</a></p></div><div class="top"><p class="src"><a name="v:extendTvSubst" class="def">extendTvSubst</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:extendCvSubstAndInScope" class="def">extendCvSubstAndInScope</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:CvSubst">CvSubst</a></p></div><div class="top"><p class="src"><a name="v:substTyVarBndr" class="def">substTyVarBndr</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; (<a href="Coercion.html#t:CvSubst">CvSubst</a>, <a href="Var.html#t:TyVar">TyVar</a>)</p></div><div class="top"><p class="src"><a name="v:substCoVarBndr" class="def">substCoVarBndr</a> :: <a href="Coercion.html#t:CvSubst">CvSubst</a> -&gt; <a href="Coercion.html#t:CoVar">CoVar</a> -&gt; (<a href="Coercion.html#t:CvSubst">CvSubst</a>, <a href="Coercion.html#t:CoVar">CoVar</a>)</p></div><h2 id="g:8">Lifting
</h2><div class="top"><p class="src"><a name="v:liftCoMatch" class="def">liftCoMatch</a> :: <a href="VarSet.html#t:TyVarSet">TyVarSet</a> -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> LiftCoSubst</p><div class="doc"><p><code><a href="Coercion.html#v:liftCoMatch">liftCoMatch</a></code> is sort of inverse to <code>liftCoSubst</code>.  In particular, if
   <code>liftCoMatch vars ty co == Just s</code>, then <code>tyCoSubst s ty == co</code>.
   That is, it matches a type against a coercion of the same
   <a href="shape.html">shape</a>, and returns a lifting substitution which could have been
   used to produce the given coercion from the given type.
</p></div></div><div class="top"><p class="src"><a name="v:liftCoSubstTyVar" class="def">liftCoSubstTyVar</a> :: LiftCoSubst -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Coercion.html#t:Coercion">Coercion</a></p></div><div class="top"><p class="src"><a name="v:liftCoSubstWith" class="def">liftCoSubstWith</a> :: [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; [<a href="Coercion.html#t:Coercion">Coercion</a>] -&gt; <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a></p></div><h2 id="g:9">Comparison
</h2><div class="top"><p class="src"><a name="v:coreEqCoercion" class="def">coreEqCoercion</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Determines syntactic equality of coercions
</p></div></div><div class="top"><p class="src"><a name="v:coreEqCoercion2" class="def">coreEqCoercion2</a> :: <a href="VarEnv.html#t:RnEnv2">RnEnv2</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><h2 id="g:10">Forcing evaluation of coercions
</h2><div class="top"><p class="src"><a name="v:seqCo" class="def">seqCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; ()</p></div><h1 id="g:11">Pretty-printing
</h1><div class="top"><p class="src"><a name="v:pprCo" class="def">pprCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></p></div><div class="top"><p class="src"><a name="v:pprParendCo" class="def">pprParendCo</a> :: <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></p></div><div class="top"><p class="src"><a name="v:pprCoAxiom" class="def">pprCoAxiom</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="Outputable.html#t:SDoc">SDoc</a></p></div><h1 id="g:12">Other
</h1><div class="top"><p class="src"><a name="v:applyCo" class="def">applyCo</a> :: <a href="Type.html#t:Type">Type</a> -&gt; <a href="Coercion.html#t:Coercion">Coercion</a> -&gt; <a href="Type.html#t:Type">Type</a></p></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.11.0</p></div></body></html>