Sophie

Sophie

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

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>TyCon</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_TyCon.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">TyCon</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Main TyCon data types
</a><ul><li><a href="#g:2">Coercion axiom constructors
</a></li><li><a href="#g:3">Constructing TyCons
</a></li><li><a href="#g:4">Predicates on TyCons
</a></li><li><a href="#g:5">Extracting information out of TyCons
</a></li><li><a href="#g:6">Manipulating TyCons
</a></li></ul></li><li><a href="#g:7">Primitive representations of Types
</a></li></ul></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:TyCon">TyCon</a> </li><li class="src short"><span class="keyword">type</span> <a href="#t:FieldLabel">FieldLabel</a> = <a href="Name.html#t:Name">Name</a></li><li class="src short"><span class="keyword">data</span>  <a href="#t:AlgTyConRhs">AlgTyConRhs</a> <ul class="subs"><li>= <a href="#v:AbstractTyCon">AbstractTyCon</a> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a>  </li><li>| <a href="#v:DataFamilyTyCon">DataFamilyTyCon</a>  </li><li>| <a href="#v:DataTyCon">DataTyCon</a> { <ul class="subs"><li><a href="#v:data_cons">data_cons</a> :: [<a href="DataCon.html#t:DataCon">DataCon</a>]</li><li><a href="#v:is_enum">is_enum</a> :: <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li></ul> }</li><li>| <a href="#v:NewTyCon">NewTyCon</a> { <ul class="subs"><li><a href="#v:data_con">data_con</a> :: <a href="DataCon.html#t:DataCon">DataCon</a></li><li><a href="#v:nt_rhs">nt_rhs</a> :: <a href="Type.html#t:Type">Type</a></li><li><a href="#v:nt_etad_rhs">nt_etad_rhs</a> :: ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</li><li><a href="#v:nt_co">nt_co</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a></li></ul> }</li></ul></li><li class="src short"><a href="#v:visibleDataCons">visibleDataCons</a> :: <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; [<a href="DataCon.html#t:DataCon">DataCon</a>]</li><li class="src short"><span class="keyword">data</span>  <a href="#t:TyConParent">TyConParent</a> <ul class="subs"><li>= <a href="#v:NoParentTyCon">NoParentTyCon</a>  </li><li>| <a href="#v:ClassTyCon">ClassTyCon</a> <a href="Class.html#t:Class">Class</a>  </li><li>| <a href="#v:IPTyCon">IPTyCon</a> (<a href="BasicTypes.html#t:IPName">IPName</a> <a href="Name.html#t:Name">Name</a>)  </li><li>| <a href="#v:AssocFamilyTyCon">AssocFamilyTyCon</a> <a href="Class.html#t:Class">Class</a>  </li><li>| <a href="#v:FamInstTyCon">FamInstTyCon</a> <a href="TyCon.html#t:TyCon">TyCon</a> [<a href="Type.html#t:Type">Type</a>] <a href="TyCon.html#t:CoAxiom">CoAxiom</a>  </li></ul></li><li class="src short"><a href="#v:isNoParent">isNoParent</a> :: <a href="TyCon.html#t:TyConParent">TyConParent</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><span class="keyword">data</span>  <a href="#t:SynTyConRhs">SynTyConRhs</a> <ul class="subs"><li>= <a href="#v:SynonymTyCon">SynonymTyCon</a> <a href="Type.html#t:Type">Type</a>  </li><li>| <a href="#v:SynFamilyTyCon">SynFamilyTyCon</a>  </li></ul></li><li class="src short"><span class="keyword">data</span>  <a href="#t:CoAxiom">CoAxiom</a>  = <a href="#v:CoAxiom">CoAxiom</a> {<ul class="subs"><li><a href="#v:co_ax_unique">co_ax_unique</a> :: <a href="Unique.html#t:Unique">Unique</a></li><li><a href="#v:co_ax_name">co_ax_name</a> :: <a href="Name.html#t:Name">Name</a></li><li><a href="#v:co_ax_tvs">co_ax_tvs</a> :: [<a href="Var.html#t:TyVar">TyVar</a>]</li><li><a href="#v:co_ax_lhs">co_ax_lhs</a> :: <a href="Type.html#t:Type">Type</a></li><li><a href="#v:co_ax_rhs">co_ax_rhs</a> :: <a href="Type.html#t:Type">Type</a></li></ul>}</li><li class="src short"><a href="#v:coAxiomName">coAxiomName</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="Name.html#t:Name">Name</a></li><li class="src short"><a href="#v:coAxiomArity">coAxiomArity</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></li><li class="src short"><a href="#v:mkAlgTyCon">mkAlgTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; [<a href="Type.html#t:PredType">PredType</a>] -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a> -&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkClassTyCon">mkClassTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="Class.html#t:Class">Class</a> -&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkIParamTyCon">mkIParamTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkFunTyCon">mkFunTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkPrimTyCon">mkPrimTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkKindTyCon">mkKindTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkLiftedPrimTyCon">mkLiftedPrimTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkTupleTyCon">mkTupleTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="DataCon.html#t:DataCon">DataCon</a> -&gt; <a href="BasicTypes.html#t:TupleSort">TupleSort</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkSynTyCon">mkSynTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="TyCon.html#t:SynTyConRhs">SynTyConRhs</a> -&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkSuperKindTyCon">mkSuperKindTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkForeignTyCon">mkForeignTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="FastString.html#t:FastString">FastString</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkPromotedDataTyCon">mkPromotedDataTyCon</a> :: <a href="DataCon.html#t:DataCon">DataCon</a> -&gt; <a href="Name.html#t:Name">Name</a> -&gt; <a href="Unique.html#t:Unique">Unique</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:mkPromotedTypeTyCon">mkPromotedTypeTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:isAlgTyCon">isAlgTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isClassTyCon">isClassTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isFamInstTyCon">isFamInstTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isFunTyCon">isFunTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isPrimTyCon">isPrimTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isTupleTyCon">isTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isUnboxedTupleTyCon">isUnboxedTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isBoxedTupleTyCon">isBoxedTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isSynTyCon">isSynTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isClosedSynTyCon">isClosedSynTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isSuperKindTyCon">isSuperKindTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isDecomposableTyCon">isDecomposableTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isForeignTyCon">isForeignTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:tyConHasKind">tyConHasKind</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isPromotedDataTyCon">isPromotedDataTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isPromotedTypeTyCon">isPromotedTypeTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isInjectiveTyCon">isInjectiveTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isDataTyCon">isDataTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isProductTyCon">isProductTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isEnumerationTyCon">isEnumerationTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isNewTyCon">isNewTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isAbstractTyCon">isAbstractTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isFamilyTyCon">isFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isSynFamilyTyCon">isSynFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isDataFamilyTyCon">isDataFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isUnLiftedTyCon">isUnLiftedTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isGadtSyntaxTyCon">isGadtSyntaxTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isDistinctTyCon">isDistinctTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isDistinctAlgRhs">isDistinctAlgRhs</a> :: <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isTyConAssoc">isTyConAssoc</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:tyConAssoc_maybe">tyConAssoc_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Class.html#t:Class">Class</a></li><li class="src short"><a href="#v:isRecursiveTyCon">isRecursiveTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isImplicitTyCon">isImplicitTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:tyConName">tyConName</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Name.html#t:Name">Name</a></li><li class="src short"><a href="#v:tyConKind">tyConKind</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Kind.html#t:Kind">Kind</a></li><li class="src short"><a href="#v:tyConUnique">tyConUnique</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Unique.html#t:Unique">Unique</a></li><li class="src short"><a href="#v:tyConTyVars">tyConTyVars</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>]</li><li class="src short"><a href="#v:tyConDataCons">tyConDataCons</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="DataCon.html#t:DataCon">DataCon</a>]</li><li class="src short"><a href="#v:tyConDataCons_maybe">tyConDataCons_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> [<a href="DataCon.html#t:DataCon">DataCon</a>]</li><li class="src short"><a href="#v:tyConSingleDataCon_maybe">tyConSingleDataCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="DataCon.html#t:DataCon">DataCon</a></li><li class="src short"><a href="#v:tyConFamilySize">tyConFamilySize</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></li><li class="src short"><a href="#v:tyConStupidTheta">tyConStupidTheta</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Type.html#t:PredType">PredType</a>]</li><li class="src short"><a href="#v:tyConArity">tyConArity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></li><li class="src short"><a href="#v:tyConParent">tyConParent</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a></li><li class="src short"><a href="#v:tyConTuple_maybe">tyConTuple_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="BasicTypes.html#t:TupleSort">TupleSort</a></li><li class="src short"><a href="#v:tyConClass_maybe">tyConClass_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Class.html#t:Class">Class</a></li><li class="src short"><a href="#v:tyConIP_maybe">tyConIP_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="BasicTypes.html#t:IPName">IPName</a> <a href="Name.html#t:Name">Name</a>)</li><li class="src short"><a href="#v:tyConFamInst_maybe">tyConFamInst_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>])</li><li class="src short"><a href="#v:tyConFamilyCoercion_maybe">tyConFamilyCoercion_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></li><li class="src short"><a href="#v:tyConFamInstSig_maybe">tyConFamInstSig_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>], <a href="TyCon.html#t:CoAxiom">CoAxiom</a>)</li><li class="src short"><a href="#v:synTyConDefn">synTyConDefn</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</li><li class="src short"><a href="#v:synTyConRhs">synTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:SynTyConRhs">SynTyConRhs</a></li><li class="src short"><a href="#v:synTyConType">synTyConType</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Type.html#t:Type">Type</a></li><li class="src short"><a href="#v:tyConExtName">tyConExtName</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="FastString.html#t:FastString">FastString</a></li><li class="src short"><a href="#v:algTyConRhs">algTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a></li><li class="src short"><a href="#v:newTyConRhs">newTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</li><li class="src short"><a href="#v:newTyConEtadRhs">newTyConEtadRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</li><li class="src short"><a href="#v:unwrapNewTyCon_maybe">unwrapNewTyCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>, <a href="TyCon.html#t:CoAxiom">CoAxiom</a>)</li><li class="src short"><a href="#v:tupleTyConBoxity">tupleTyConBoxity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Boxity">Boxity</a></li><li class="src short"><a href="#v:tupleTyConSort">tupleTyConSort</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:TupleSort">TupleSort</a></li><li class="src short"><a href="#v:tupleTyConArity">tupleTyConArity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></li><li class="src short"><a href="#v:tcExpandTyCon_maybe">tcExpandTyCon_maybe</a> ::  <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [tyco] -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([(<a href="Var.html#t:TyVar">TyVar</a>, tyco)], <a href="Type.html#t:Type">Type</a>, [tyco])</li><li class="src short"><a href="#v:coreExpandTyCon_maybe">coreExpandTyCon_maybe</a> ::  <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [tyco] -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([(<a href="Var.html#t:TyVar">TyVar</a>, tyco)], <a href="Type.html#t:Type">Type</a>, [tyco])</li><li class="src short"><a href="#v:makeTyConAbstract">makeTyConAbstract</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></li><li class="src short"><a href="#v:newTyConCo">newTyConCo</a> :: <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:newTyConCo_maybe">newTyConCo_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></li><li class="src short"><span class="keyword">data</span>  <a href="#t:PrimRep">PrimRep</a> <ul class="subs"><li>= <a href="#v:VoidRep">VoidRep</a>  </li><li>| <a href="#v:PtrRep">PtrRep</a>  </li><li>| <a href="#v:IntRep">IntRep</a>  </li><li>| <a href="#v:WordRep">WordRep</a>  </li><li>| <a href="#v:Int64Rep">Int64Rep</a>  </li><li>| <a href="#v:Word64Rep">Word64Rep</a>  </li><li>| <a href="#v:AddrRep">AddrRep</a>  </li><li>| <a href="#v:FloatRep">FloatRep</a>  </li><li>| <a href="#v:DoubleRep">DoubleRep</a>  </li></ul></li><li class="src short"><a href="#v:tyConPrimRep">tyConPrimRep</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a></li><li class="src short"><a href="#v:primRepSizeW">primRepSizeW</a> :: <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></li></ul></div><div id="interface"><h1 id="g:1">Main TyCon data types
</h1><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:TyCon" class="def">TyCon</a>  </p><div class="doc"><p>TyCons represent type constructors. Type constructors are introduced by things such as:
</p><p>1) Data declarations: <code>data Foo = ...</code> creates the <code>Foo</code> type constructor of kind <code>*</code>
</p><p>2) Type synonyms: <code>type Foo = ...</code> creates the <code>Foo</code> type constructor
</p><p>3) Newtypes: <code>newtype Foo a = MkFoo ...</code> creates the <code>Foo</code> type constructor of kind <code>* -&gt; *</code>
</p><p>4) Class declarations: <code>class Foo where</code> creates the <code>Foo</code> type constructor of kind <code>*</code>
</p><p>This data type also encodes a number of primitive, built in type constructors such as those
 for function and tuple types.
</p></div><div class="subs instances"><p id="control.i:TyCon" class="caption collapser" onclick="toggleSection('i:TyCon')">Instances</p><div id="section.i:TyCon" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="TyCon.html#t:TyCon">TyCon</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="TyCon.html#t:TyCon">TyCon</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="TyCon.html#t:TyCon">TyCon</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="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Unique.html#t:Uniquable">Uniquable</a> <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Name.html#t:NamedThing">NamedThing</a> <a href="TyCon.html#t:TyCon">TyCon</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:FieldLabel" class="def">FieldLabel</a> = <a href="Name.html#t:Name">Name</a></p><div class="doc"><p>Names of the fields in an algebraic record type
</p></div></div><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:AlgTyConRhs" class="def">AlgTyConRhs</a>  </p><div class="doc"><p>Represents right-hand-sides of <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s for algebraic types
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:AbstractTyCon" class="def">AbstractTyCon</a> <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></td><td class="doc"><p>Says that we know nothing about this data type, except that
 it's represented by a pointer.  Used when we export a data type
 abstractly into an .hi file.
</p></td></tr><tr><td class="src"><a name="v:DataFamilyTyCon" class="def">DataFamilyTyCon</a></td><td class="doc"><p>Represents an open type family without a fixed right hand
 side.  Additional instances can appear at any time.
</p><p>These are introduced by either a top level declaration:
</p><pre> data T a :: *
</pre><p>Or an associated data type declaration, within a class declaration:
</p><pre> class C a b where
   data T b :: *
</pre></td></tr><tr><td class="src"><a name="v:DataTyCon" class="def">DataTyCon</a></td><td class="doc"><p>Information about those <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s derived from a <code>data</code>
 declaration. This includes data types with no constructors at
 all.
</p></td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:data_cons" class="def">data_cons</a> :: [<a href="DataCon.html#t:DataCon">DataCon</a>]</dt><dd class="doc"><p>The data type constructors; can be empty if the user 
   declares the type to have no constructors
</p><p>INVARIANT: Kept in order of increasing <code><a href="DataCon.html#t:DataCon">DataCon</a></code> tag
	  (see the tag assignment in DataCon.mkDataCon)
</p></dd><dt class="src"><a name="v:is_enum" class="def">is_enum</a> :: <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></dt><dd class="doc"><p>Cached value: is this an enumeration type? 
   See Note [Enumeration types]
</p></dd></dl><div class="clear"></div></div></td></tr><tr><td class="src"><a name="v:NewTyCon" class="def">NewTyCon</a></td><td class="doc"><p>Information about those <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s derived from a <code>newtype</code> declaration
</p></td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:data_con" class="def">data_con</a> :: <a href="DataCon.html#t:DataCon">DataCon</a></dt><dd class="doc"><p>The unique constructor for the <code>newtype</code>. 
   It has no existentials
</p></dd><dt class="src"><a name="v:nt_rhs" class="def">nt_rhs</a> :: <a href="Type.html#t:Type">Type</a></dt><dd class="doc"><p>Cached value: the argument type of the constructor, 
 which is just the representation type of the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
 (remember that <code>newtype</code>s do not exist at runtime 
 so need a different representation type).
</p><p>The free <code><a href="Var.html#t:TyVar">TyVar</a></code>s of this type are the <code><a href="TyCon.html#v:tyConTyVars">tyConTyVars</a></code> 
 from the corresponding <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></dd><dt class="src"><a name="v:nt_etad_rhs" class="def">nt_etad_rhs</a> :: ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</dt><dd class="doc"><p>Same as the <code><a href="TyCon.html#v:nt_rhs">nt_rhs</a></code>, but this time eta-reduced. 
 Hence the list of <code><a href="Var.html#t:TyVar">TyVar</a></code>s in this field may be 
 shorter than the declared arity of the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>.
</p></dd><dt class="src"><a name="v:nt_co" class="def">nt_co</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a></dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div></div><div class="top"><p class="src"><a name="v:visibleDataCons" class="def">visibleDataCons</a> :: <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; [<a href="DataCon.html#t:DataCon">DataCon</a>]</p><div class="doc"><p>Both type classes as well as family instances imply implicit
 type constructors.  These implicit type constructors refer to their parent
 structure (ie, the class or family from which they derive) using a type of
 the following form.  We use <code><a href="TyCon.html#t:TyConParent">TyConParent</a></code> for both algebraic and synonym 
 types, but the variant <code><a href="TyCon.html#v:ClassTyCon">ClassTyCon</a></code> will only be used by algebraic <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s.
</p><p>Extract those <code><a href="DataCon.html#t:DataCon">DataCon</a></code>s that we are able to learn about.  Note
 that visibility in this sense does not correspond to visibility in
 the context of any particular user program!
</p></div></div><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:TyConParent" class="def">TyConParent</a>  </p><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:NoParentTyCon" class="def">NoParentTyCon</a></td><td class="doc"><p>An ordinary type constructor has no parent.
</p></td></tr><tr><td class="src"><a name="v:ClassTyCon" class="def">ClassTyCon</a> <a href="Class.html#t:Class">Class</a></td><td class="doc"><p>Type constructors representing a class dictionary.
 See Note [ATyCon for classes] in TypeRep
</p></td></tr><tr><td class="src"><a name="v:IPTyCon" class="def">IPTyCon</a> (<a href="BasicTypes.html#t:IPName">IPName</a> <a href="Name.html#t:Name">Name</a>)</td><td class="doc"><p>Associated type of a implicit parameter.
</p></td></tr><tr><td class="src"><a name="v:AssocFamilyTyCon" class="def">AssocFamilyTyCon</a> <a href="Class.html#t:Class">Class</a></td><td class="doc"><p>An *associated* type of a class.  
</p></td></tr><tr><td class="src"><a name="v:FamInstTyCon" class="def">FamInstTyCon</a> <a href="TyCon.html#t:TyCon">TyCon</a> [<a href="Type.html#t:Type">Type</a>] <a href="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc"><p>Type constructors representing an instance of a type family. Parameters:
</p><p>1) The type family in question
</p><p>2) Instance types; free variables are the <code><a href="TyCon.html#v:tyConTyVars">tyConTyVars</a></code>
  of the current <code><a href="TyCon.html#t:TyCon">TyCon</a></code> (not the family one). INVARIANT: 
  the number of types matches the arity of the family <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p><p>3) A <code>CoTyCon</code> identifying the representation
  type with the type instance family
</p></td></tr></table></div><div class="subs instances"><p id="control.i:TyConParent" class="caption collapser" onclick="toggleSection('i:TyConParent')">Instances</p><div id="section.i:TyConParent" class="show"><table><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="TyCon.html#t:TyConParent">TyConParent</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:isNoParent" class="def">isNoParent</a> :: <a href="TyCon.html#t:TyConParent">TyConParent</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p></div><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:SynTyConRhs" class="def">SynTyConRhs</a>  </p><div class="doc"><p>Information pertaining to the expansion of a type synonym (<code>type</code>)
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:SynonymTyCon" class="def">SynonymTyCon</a> <a href="Type.html#t:Type">Type</a></td><td class="doc"><p>An ordinary type synonyn.
</p></td></tr><tr><td class="src"><a name="v:SynFamilyTyCon" class="def">SynFamilyTyCon</a></td><td class="doc"><p>A type synonym family  e.g. <code>type family F x y :: * -&gt; *</code>
</p></td></tr></table></div></div><h2 id="g:2">Coercion axiom constructors
</h2><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:CoAxiom" class="def">CoAxiom</a>  </p><div class="doc"><p>A <code><a href="TyCon.html#t:CoAxiom">CoAxiom</a></code> is a &quot;coercion constructor&quot;, i.e. a named equality axiom.
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:CoAxiom" class="def">CoAxiom</a></td><td class="doc empty">&nbsp;</td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:co_ax_unique" class="def">co_ax_unique</a> :: <a href="Unique.html#t:Unique">Unique</a></dt><dd class="doc empty">&nbsp;</dd><dt class="src"><a name="v:co_ax_name" class="def">co_ax_name</a> :: <a href="Name.html#t:Name">Name</a></dt><dd class="doc empty">&nbsp;</dd><dt class="src"><a name="v:co_ax_tvs" class="def">co_ax_tvs</a> :: [<a href="Var.html#t:TyVar">TyVar</a>]</dt><dd class="doc empty">&nbsp;</dd><dt class="src"><a name="v:co_ax_lhs" class="def">co_ax_lhs</a> :: <a href="Type.html#t:Type">Type</a></dt><dd class="doc empty">&nbsp;</dd><dt class="src"><a name="v:co_ax_rhs" class="def">co_ax_rhs</a> :: <a href="Type.html#t:Type">Type</a></dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:CoAxiom" class="caption collapser" onclick="toggleSection('i:CoAxiom')">Instances</p><div id="section.i:CoAxiom" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</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="TyCon.html#t:CoAxiom">CoAxiom</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="TyCon.html#t:CoAxiom">CoAxiom</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="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Unique.html#t:Uniquable">Uniquable</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Name.html#t:NamedThing">NamedThing</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:coAxiomName" class="def">coAxiomName</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="Name.html#t:Name">Name</a></p></div><div class="top"><p class="src"><a name="v:coAxiomArity" class="def">coAxiomArity</a> :: <a href="TyCon.html#t:CoAxiom">CoAxiom</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></p></div><h2 id="g:3">Constructing TyCons
</h2><div class="top"><p class="src"><a name="v:mkAlgTyCon" class="def">mkAlgTyCon</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 empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="Kind.html#t:Kind">Kind</a></td><td class="doc"><p>Kind of the resulting <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></td></tr><tr><td class="src">-&gt; [<a href="Var.html#t:TyVar">TyVar</a>]</td><td class="doc"><p><code><a href="Var.html#t:TyVar">TyVar</a></code>s scoped over: see <code><a href="TyCon.html#v:tyConTyVars">tyConTyVars</a></code>. 
   Arity is inferred from the length of this list
</p></td></tr><tr><td class="src">-&gt; [<a href="Type.html#t:PredType">PredType</a>]</td><td class="doc"><p>Stupid theta: see <code>algTcStupidTheta</code>
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a></td><td class="doc"><p>Information about dat aconstructors
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a></td><td class="doc"><p>Is the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> recursive?
</p></td></tr><tr><td class="src">-&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></td><td class="doc"><p>Was the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> declared with GADT syntax?
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="doc"><p>This is the making of an algebraic <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. Notably, you have to
 pass in the generic (in the -XGenerics sense) information about the
 type constructor - you can get hold of it easily (see Generics
 module)
</p></div></div><div class="top"><p class="src"><a name="v:mkClassTyCon" class="def">mkClassTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="Class.html#t:Class">Class</a> -&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Simpler specialization of <code><a href="TyCon.html#v:mkAlgTyCon">mkAlgTyCon</a></code> for classes
</p></div></div><div class="top"><p class="src"><a name="v:mkIParamTyCon" class="def">mkIParamTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="Var.html#t:TyVar">TyVar</a> -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a> -&gt; <a href="BasicTypes.html#t:RecFlag">RecFlag</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Simpler specialization of <code><a href="TyCon.html#v:mkAlgTyCon">mkAlgTyCon</a></code> for implicit paramaters
</p></div></div><div class="top"><p class="src"><a name="v:mkFunTyCon" class="def">mkFunTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Given the name of the function type constructor and it's kind, create the
 corresponding <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. It is reccomended to use <code><a href="TypeRep.html#v:funTyCon">funTyCon</a></code> if you want 
 this functionality
</p></div></div><div class="top"><p class="src"><a name="v:mkPrimTyCon" class="def">mkPrimTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create an unlifted primitive <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, such as <code>Int#</code>
</p></div></div><div class="top"><p class="src"><a name="v:mkKindTyCon" class="def">mkKindTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Kind constructors
</p></div></div><div class="top"><p class="src"><a name="v:mkLiftedPrimTyCon" class="def">mkLiftedPrimTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create a lifted primitive <code><a href="TyCon.html#t:TyCon">TyCon</a></code> such as <code>RealWorld</code>
</p></div></div><div class="top"><p class="src"><a name="v:mkTupleTyCon" class="def">mkTupleTyCon</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 empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="Kind.html#t:Kind">Kind</a></td><td class="doc"><p>Kind of the resulting <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></td></tr><tr><td class="src">-&gt; <a href="BasicTypes.html#t:Arity">Arity</a></td><td class="doc"><p>Arity of the tuple
</p></td></tr><tr><td class="src">-&gt; [<a href="Var.html#t:TyVar">TyVar</a>]</td><td class="doc"><p><code><a href="Var.html#t:TyVar">TyVar</a></code>s scoped over: see <code><a href="TyCon.html#v:tyConTyVars">tyConTyVars</a></code>
</p></td></tr><tr><td class="src">-&gt; <a href="DataCon.html#t:DataCon">DataCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="BasicTypes.html#t:TupleSort">TupleSort</a></td><td class="doc"><p>Whether the tuple is boxed or unboxed
</p></td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="doc"><p>Foreign-imported (.NET) type constructors are represented
 as primitive, but <em>lifted</em>, <code>TyCons</code> for now. They are lifted
 because the Haskell type <code>T</code> representing the (foreign) .NET
 type <code>T</code> is actually implemented (in ILX) as a <code>thunk<a href="T">T</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:mkSynTyCon" class="def">mkSynTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>] -&gt; <a href="TyCon.html#t:SynTyConRhs">SynTyConRhs</a> -&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create a type synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:mkSuperKindTyCon" class="def">mkSuperKindTyCon</a> :: <a href="Name.html#t:Name">Name</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create a super-kind <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:mkForeignTyCon" class="def">mkForeignTyCon</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 empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="FastString.html#t:FastString">FastString</a></td><td class="doc"><p>Name of the foreign imported thing, maybe
</p></td></tr><tr><td class="src">-&gt; <a href="Kind.html#t:Kind">Kind</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="BasicTypes.html#t:Arity">Arity</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div><div class="top"><p class="src"><a name="v:mkPromotedDataTyCon" class="def">mkPromotedDataTyCon</a> :: <a href="DataCon.html#t:DataCon">DataCon</a> -&gt; <a href="Name.html#t:Name">Name</a> -&gt; <a href="Unique.html#t:Unique">Unique</a> -&gt; <a href="Kind.html#t:Kind">Kind</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create a promoted data constructor <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:mkPromotedTypeTyCon" class="def">mkPromotedTypeTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Create a promoted type constructor <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><h2 id="g:4">Predicates on TyCons
</h2><div class="top"><p class="src"><a name="v:isAlgTyCon" class="def">isAlgTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Returns <code>True</code> if the supplied <code><a href="TyCon.html#t:TyCon">TyCon</a></code> resulted from either a
 <code>data</code> or <code>newtype</code> declaration
</p></div></div><div class="top"><p class="src"><a name="v:isClassTyCon" class="def">isClassTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that for a class instance?
</p></div></div><div class="top"><p class="src"><a name="v:isFamInstTyCon" class="def">isFamInstTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that for a family instance, be that for a synonym or an
 algebraic family instance?
</p></div></div><div class="top"><p class="src"><a name="v:isFunTyCon" class="def">isFunTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</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:isPrimTyCon" class="def">isPrimTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Does this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> represent something that cannot be defined in Haskell?
</p></div></div><div class="top"><p class="src"><a name="v:isTupleTyCon" class="def">isTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Does this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> represent a tuple?
</p><p>NB: when compiling <code>Data.Tuple</code>, the tycons won't reply <code>True</code> to
 <code><a href="TyCon.html#v:isTupleTyCon">isTupleTyCon</a></code>, becuase they are built as <code>AlgTyCons</code>.  However they
 get spat into the interface file as tuple tycons, so I don't think
 it matters.
</p></div></div><div class="top"><p class="src"><a name="v:isUnboxedTupleTyCon" class="def">isUnboxedTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> for an unboxed tuple?
</p></div></div><div class="top"><p class="src"><a name="v:isBoxedTupleTyCon" class="def">isBoxedTupleTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> for a boxed tuple?
</p></div></div><div class="top"><p class="src"><a name="v:isSynTyCon" class="def">isSynTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a <code><a href="TyCon.html#t:TyCon">TyCon</a></code> representing a type synonym (<code>type</code>)?
</p></div></div><div class="top"><p class="src"><a name="v:isClosedSynTyCon" class="def">isClosedSynTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that can have no further instances appear?
</p></div></div><div class="top"><p class="src"><a name="v:isSuperKindTyCon" class="def">isSuperKindTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a super-kind <code><a href="TyCon.html#t:TyCon">TyCon</a></code>?
</p></div></div><div class="top"><p class="src"><a name="v:isDecomposableTyCon" class="def">isDecomposableTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</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:isForeignTyCon" class="def">isForeignTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> of a foreign-imported type constructor?
</p></div></div><div class="top"><p class="src"><a name="v:tyConHasKind" class="def">tyConHasKind</a> :: <a href="TyCon.html#t:TyCon">TyCon</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:isPromotedDataTyCon" class="def">isPromotedDataTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a PromotedDataTyCon?
</p></div></div><div class="top"><p class="src"><a name="v:isPromotedTypeTyCon" class="def">isPromotedTypeTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a PromotedTypeTyCon?
</p></div></div><div class="top"><p class="src"><a name="v:isInjectiveTyCon" class="def">isInjectiveTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Injective <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s can be decomposed, so that
     T ty1 ~ T ty2  =&gt;  ty1 ~ ty2
</p></div></div><div class="top"><p class="src"><a name="v:isDataTyCon" class="def">isDataTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Returns <code>True</code> for data types that are <em>definitely</em> represented by 
 heap-allocated constructors.  These are scrutinised by Core-level 
 <code>case</code> expressions, and they get info tables allocated for them.
</p><p>Generally, the function will be true for all <code>data</code> types and false
 for <code>newtype</code>s, unboxed tuples and type family <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s. But it is
 not guaranteed to return <code>True</code> in all cases that it could.
</p><p>NB: for a data type family, only the <em>instance</em> <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s
     get an info table.  The family declaration <code><a href="TyCon.html#t:TyCon">TyCon</a></code> does not
</p></div></div><div class="top"><p class="src"><a name="v:isProductTyCon" class="def">isProductTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>A <em>product</em> <code><a href="TyCon.html#t:TyCon">TyCon</a></code> must both:
</p><ol><li> Have <em>one</em> constructor
</li><li> <em>Not</em> be existential
</li></ol><p>However other than this there are few restrictions: they may be <code>data</code> or <code>newtype</code> 
 <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s of any boxity and may even be recursive.
</p></div></div><div class="top"><p class="src"><a name="v:isEnumerationTyCon" class="def">isEnumerationTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this an algebraic <code><a href="TyCon.html#t:TyCon">TyCon</a></code> which is just an enumeration of values?
</p></div></div><div class="top"><p class="src"><a name="v:isNewTyCon" class="def">isNewTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that for a <code>newtype</code>
</p></div></div><div class="top"><p class="src"><a name="v:isAbstractTyCon" class="def">isAbstractTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Test if the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is algebraic but abstract (invisible data constructors)
</p></div></div><div class="top"><p class="src"><a name="v:isFamilyTyCon" class="def">isFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, synonym or otherwise, that may have further instances appear?
</p></div></div><div class="top"><p class="src"><a name="v:isSynFamilyTyCon" class="def">isSynFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that can have may have further instances appear?
</p></div></div><div class="top"><p class="src"><a name="v:isDataFamilyTyCon" class="def">isDataFamilyTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code> that can have may have further instances appear?
</p></div></div><div class="top"><p class="src"><a name="v:isUnLiftedTyCon" class="def">isUnLiftedTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> unlifted (i.e. cannot contain bottom)? Note that this can only
 be true for primitive and unboxed-tuple <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s
</p></div></div><div class="top"><p class="src"><a name="v:isGadtSyntaxTyCon" class="def">isGadtSyntaxTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this an algebraic <code><a href="TyCon.html#t:TyCon">TyCon</a></code> declared with the GADT syntax?
</p></div></div><div class="top"><p class="src"><a name="v:isDistinctTyCon" class="def">isDistinctTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p><code><a href="TyCon.html#v:isDistinctTyCon">isDistinctTyCon</a></code> is true of <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s that are equal only to 
 themselves, even via coercions (except for unsafeCoerce).
 This excludes newtypes, type functions, type synonyms.
 It relates directly to the FC consistency story: 
     If the axioms are consistent, 
     and  co : S tys ~ T tys, and S,T are <a href="distinct.html">distinct</a> TyCons,
     then S=T.
 Cf Note [Pruning dead case alternatives] in Unify
</p></div></div><div class="top"><p class="src"><a name="v:isDistinctAlgRhs" class="def">isDistinctAlgRhs</a> :: <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</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:isTyConAssoc" class="def">isTyConAssoc</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Are we able to extract informationa <code><a href="Var.html#t:TyVar">TyVar</a></code> to class argument list
 mappping from a given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>?
</p></div></div><div class="top"><p class="src"><a name="v:tyConAssoc_maybe" class="def">tyConAssoc_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Class.html#t:Class">Class</a></p></div><div class="top"><p class="src"><a name="v:isRecursiveTyCon" class="def">isRecursiveTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Is this a recursive <code><a href="TyCon.html#t:TyCon">TyCon</a></code>?
</p></div></div><div class="top"><p class="src"><a name="v:isImplicitTyCon" class="def">isImplicitTyCon</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Bool.html#t:Bool">Bool</a></p><div class="doc"><p>Identifies implicit tycons that, in particular, do not go into interface
 files (because they are implicitly reconstructed when the interface is
 read).
</p><p>Note that:
</p><ul><li> Associated families are implicit, as they are re-constructed from
   the class declaration in which they reside, and 
</li><li> Family instances are <em>not</em> implicit as they represent the instance body
   (similar to a <code>dfun</code> does that for a class instance).
</li></ul></div></div><h2 id="g:5">Extracting information out of TyCons
</h2><div class="top"><p class="src"><a name="v:tyConName" class="def">tyConName</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Name.html#t:Name">Name</a></p><div class="doc"><p>Same Name as the type constructor
</p><p>Same Name as the data constructor
</p></div></div><div class="top"><p class="src"><a name="v:tyConKind" class="def">tyConKind</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Kind.html#t:Kind">Kind</a></p></div><div class="top"><p class="src"><a name="v:tyConUnique" class="def">tyConUnique</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Unique.html#t:Unique">Unique</a></p><div class="doc"><p>Same Unique as the type constructor
</p><p>Same Unique as the data constructor
</p></div></div><div class="top"><p class="src"><a name="v:tyConTyVars" class="def">tyConTyVars</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Var.html#t:TyVar">TyVar</a>]</p><div class="doc"><p>The kind and type variables used in the type constructor.
 Invariant: length tyvars = arity
 Precisely, this list scopes over:
</p><ol><li> The <code>algTcStupidTheta</code>
 2. The cached types in 'algTyConRhs.NewTyCon'
 3. The family instance types if present
</li></ol><p>Note that it does <em>not</em> scope over the data constructors.
</p></div></div><div class="top"><p class="src"><a name="v:tyConDataCons" class="def">tyConDataCons</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="DataCon.html#t:DataCon">DataCon</a>]</p><div class="doc"><p>As <code><a href="TyCon.html#v:tyConDataCons_maybe">tyConDataCons_maybe</a></code>, but returns the empty list of constructors if no constructors
 could be found
</p></div></div><div class="top"><p class="src"><a name="v:tyConDataCons_maybe" class="def">tyConDataCons_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> [<a href="DataCon.html#t:DataCon">DataCon</a>]</p><div class="doc"><p>Determine the <code><a href="DataCon.html#t:DataCon">DataCon</a></code>s originating from the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, if the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is the
 sort that can have any constructors (note: this does not include abstract algebraic types)
</p></div></div><div class="top"><p class="src"><a name="v:tyConSingleDataCon_maybe" class="def">tyConSingleDataCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="DataCon.html#t:DataCon">DataCon</a></p><div class="doc"><p>If the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code> has a <em>single</em> data constructor, i.e. it is a <code>data</code> type with one
 alternative, a tuple type or a <code>newtype</code> then that constructor is returned. If the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
 has more than one constructor, or represents a primitive or function type constructor then
 <code>Nothing</code> is returned. In any other case, the function panics
</p></div></div><div class="top"><p class="src"><a name="v:tyConFamilySize" class="def">tyConFamilySize</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></p><div class="doc"><p>Determine the number of value constructors a <code><a href="TyCon.html#t:TyCon">TyCon</a></code> has. Panics if the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
 is not algebraic or a tuple
</p></div></div><div class="top"><p class="src"><a name="v:tyConStupidTheta" class="def">tyConStupidTheta</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; [<a href="Type.html#t:PredType">PredType</a>]</p><div class="doc"><p>Find the &quot;stupid theta&quot; of the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. A &quot;stupid theta&quot; is the context to the left of
 an algebraic type declaration, e.g. <code>Eq a</code> in the declaration <code>data Eq a =&gt; T a ...</code>
</p></div></div><div class="top"><p class="src"><a name="v:tyConArity" class="def">tyConArity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></p><div class="doc"><p>n if ty_con :: * -&gt; ... -&gt; *  n times
</p></div></div><div class="top"><p class="src"><a name="v:tyConParent" class="def">tyConParent</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyConParent">TyConParent</a></p></div><div class="top"><p class="src"><a name="v:tyConTuple_maybe" class="def">tyConTuple_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="BasicTypes.html#t:TupleSort">TupleSort</a></p></div><div class="top"><p class="src"><a name="v:tyConClass_maybe" class="def">tyConClass_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="Class.html#t:Class">Class</a></p><div class="doc"><p>If this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is that for a class instance, return the class it is for.
 Otherwise returns <code>Nothing</code>
</p></div></div><div class="top"><p class="src"><a name="v:tyConIP_maybe" class="def">tyConIP_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (<a href="BasicTypes.html#t:IPName">IPName</a> <a href="Name.html#t:Name">Name</a>)</p><div class="doc"><p>If this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is that for implicit parameter, return the IP it is for.
 Otherwise returns <code>Nothing</code>
</p></div></div><div class="top"><p class="src"><a name="v:tyConFamInst_maybe" class="def">tyConFamInst_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>])</p><div class="doc"><p>If this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is that of a family instance, return the family in question
 and the instance types. Otherwise, return <code>Nothing</code>
</p></div></div><div class="top"><p class="src"><a name="v:tyConFamilyCoercion_maybe" class="def">tyConFamilyCoercion_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></p><div class="doc"><p>If this <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is that of a family instance, return a <code><a href="TyCon.html#t:TyCon">TyCon</a></code> which represents 
 a coercion identifying the representation type with the type instance family.
 Otherwise, return <code>Nothing</code>
</p></div></div><div class="top"><p class="src"><a name="v:tyConFamInstSig_maybe" class="def">tyConFamInstSig_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>], <a href="TyCon.html#t:CoAxiom">CoAxiom</a>)</p></div><div class="top"><p class="src"><a name="v:synTyConDefn" class="def">synTyConDefn</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</p><div class="doc"><p>Extract the <code><a href="Var.html#t:TyVar">TyVar</a></code>s bound by a type synonym and the corresponding (unsubstituted) right hand side.
 If the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not a type synonym, panics
</p></div></div><div class="top"><p class="src"><a name="v:synTyConRhs" class="def">synTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:SynTyConRhs">SynTyConRhs</a></p><div class="doc"><p>Extract the information pertaining to the right hand side of a type synonym (<code>type</code>) declaration. Panics
 if the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not a type synonym
</p></div></div><div class="top"><p class="src"><a name="v:synTyConType" class="def">synTyConType</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="Type.html#t:Type">Type</a></p><div class="doc"><p>Find the expansion of the type synonym represented by the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. The free variables of this
 type will typically include those <code><a href="Var.html#t:TyVar">TyVar</a></code>s bound by the <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. Panics if the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not that of
 a type synonym
</p></div></div><div class="top"><p class="src"><a name="v:tyConExtName" class="def">tyConExtName</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="FastString.html#t:FastString">FastString</a></p><div class="doc"><p><code>Just e</code> for foreign-imported types, 
   holds the name of the imported thing
</p></div></div><div class="top"><p class="src"><a name="v:algTyConRhs" class="def">algTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a></p><div class="doc"><p>Extract an <code><a href="TyCon.html#t:AlgTyConRhs">AlgTyConRhs</a></code> with information about data constructors from an algebraic or tuple
 <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. Panics for any other sort of <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:newTyConRhs" class="def">newTyConRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</p><div class="doc"><p>Extract the bound type variables and type expansion of a type synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code>. Panics if the
 <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not a synonym
</p></div></div><div class="top"><p class="src"><a name="v:newTyConEtadRhs" class="def">newTyConEtadRhs</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; ([<a href="Var.html#t:TyVar">TyVar</a>], <a href="Type.html#t:Type">Type</a>)</p><div class="doc"><p>Extract the bound type variables and type expansion of an eta-contracted type synonym <code><a href="TyCon.html#t:TyCon">TyCon</a></code>.
 Panics if the <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not a synonym
</p></div></div><div class="top"><p class="src"><a name="v:unwrapNewTyCon_maybe" class="def">unwrapNewTyCon_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</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="Type.html#t:Type">Type</a>, <a href="TyCon.html#t:CoAxiom">CoAxiom</a>)</p><div class="doc"><p>Take a <code><a href="TyCon.html#t:TyCon">TyCon</a></code> apart into the <code><a href="Var.html#t:TyVar">TyVar</a></code>s it scopes over, the <code><a href="Type.html#t:Type">Type</a></code> it expands
 into, and (possibly) a coercion from the representation type to the <code>newtype</code>.
 Returns <code>Nothing</code> if this is not possible.
</p></div></div><div class="top"><p class="src"><a name="v:tupleTyConBoxity" class="def">tupleTyConBoxity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Boxity">Boxity</a></p><div class="doc"><p>Extract the boxity of the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, if it is a <code>TupleTyCon</code>.
 Panics otherwise
</p></div></div><div class="top"><p class="src"><a name="v:tupleTyConSort" class="def">tupleTyConSort</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:TupleSort">TupleSort</a></p><div class="doc"><p>Extract the <code><a href="BasicTypes.html#t:TupleSort">TupleSort</a></code> of the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, if it is a <code>TupleTyCon</code>.
 Panics otherwise
</p></div></div><div class="top"><p class="src"><a name="v:tupleTyConArity" class="def">tupleTyConArity</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="BasicTypes.html#t:Arity">Arity</a></p><div class="doc"><p>Extract the arity of the given <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, if it is a <code>TupleTyCon</code>.
 Panics otherwise
</p></div></div><h2 id="g:6">Manipulating TyCons
</h2><div class="top"><p class="src"><a name="v:tcExpandTyCon_maybe" class="def">tcExpandTyCon_maybe</a></p><div class="subs arguments"><p class="caption">Arguments</p><table><tr><td class="src">:: <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; [tyco]</td><td class="doc"><p>Arguments to <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></td></tr><tr><td class="src">-&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([(<a href="Var.html#t:TyVar">TyVar</a>, tyco)], <a href="Type.html#t:Type">Type</a>, [tyco])</td><td class="doc"><p>Returns a <code><a href="Var.html#t:TyVar">TyVar</a></code> substitution, the body type
 of the synonym (not yet substituted) and any arguments
 remaining from the application
</p></td></tr></table></div><div class="doc"><p>Used to create the view <em>Core</em> has on <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s. We expand 
 not only closed synonyms like <code><a href="TyCon.html#v:tcExpandTyCon_maybe">tcExpandTyCon_maybe</a></code>,
 but also non-recursive <code>newtype</code>s
</p><p>Used to create the view the <em>typechecker</em> has on <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s. 
 We expand (closed) synonyms only, cf. <code><a href="TyCon.html#v:coreExpandTyCon_maybe">coreExpandTyCon_maybe</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:coreExpandTyCon_maybe" class="def">coreExpandTyCon_maybe</a></p><div class="subs arguments"><p class="caption">Arguments</p><table><tr><td class="src">:: <a href="TyCon.html#t:TyCon">TyCon</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">-&gt; [tyco]</td><td class="doc"><p>Arguments to <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></td></tr><tr><td class="src">-&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([(<a href="Var.html#t:TyVar">TyVar</a>, tyco)], <a href="Type.html#t:Type">Type</a>, [tyco])</td><td class="doc"><p>Returns a <code><a href="Var.html#t:TyVar">TyVar</a></code> substitution, the body type
 of the synonym (not yet substituted) and any arguments
 remaining from the application
</p></td></tr></table></div><div class="doc"><p>Used to create the view the <em>typechecker</em> has on <code><a href="TyCon.html#t:TyCon">TyCon</a></code>s. 
 We expand (closed) synonyms only, cf. <code><a href="TyCon.html#v:coreExpandTyCon_maybe">coreExpandTyCon_maybe</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:makeTyConAbstract" class="def">makeTyConAbstract</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:TyCon">TyCon</a></p><div class="doc"><p>Make an algebraic <code><a href="TyCon.html#t:TyCon">TyCon</a></code> abstract. Panics if the supplied <code><a href="TyCon.html#t:TyCon">TyCon</a></code> is not algebraic
</p></div></div><div class="top"><p class="src"><a name="v:newTyConCo" class="def">newTyConCo</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:CoAxiom">CoAxiom</a></p></div><div class="top"><p class="src"><a name="v:newTyConCo_maybe" class="def">newTyConCo_maybe</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="../base-4.5.1.0/Data-Maybe.html#t:Maybe">Maybe</a> <a href="TyCon.html#t:CoAxiom">CoAxiom</a></p><div class="doc"><p>Extracts the <code>newtype</code> coercion from such a <code><a href="TyCon.html#t:TyCon">TyCon</a></code>, which can be used to construct something
 with the <code>newtype</code>s type from its representation type (right hand side). If the supplied <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
 is not a <code>newtype</code>, returns <code>Nothing</code>
</p></div></div><h1 id="g:7">Primitive representations of Types
</h1><div class="top"><p class="src"><span class="keyword">data</span>  <a name="t:PrimRep" class="def">PrimRep</a>  </p><div class="doc"><p>A <code><a href="TyCon.html#t:PrimRep">PrimRep</a></code> is an abstraction of a type.  It contains information that
 the code generator needs in order to pass arguments, return results,
 and store values of this type.
</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:VoidRep" class="def">VoidRep</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:PtrRep" class="def">PtrRep</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:IntRep" class="def">IntRep</a></td><td class="doc"><p>Signed, word-sized value
</p></td></tr><tr><td class="src"><a name="v:WordRep" class="def">WordRep</a></td><td class="doc"><p>Unsigned, word-sized value
</p></td></tr><tr><td class="src"><a name="v:Int64Rep" class="def">Int64Rep</a></td><td class="doc"><p>Signed, 64 bit value (with 32-bit words only)
</p></td></tr><tr><td class="src"><a name="v:Word64Rep" class="def">Word64Rep</a></td><td class="doc"><p>Unsigned, 64 bit value (with 32-bit words only)
</p></td></tr><tr><td class="src"><a name="v:AddrRep" class="def">AddrRep</a></td><td class="doc"><p>A pointer, but <em>not</em> to a Haskell value (use <code><a href="TyCon.html#v:PtrRep">PtrRep</a></code>)
</p></td></tr><tr><td class="src"><a name="v:FloatRep" class="def">FloatRep</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:DoubleRep" class="def">DoubleRep</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="subs instances"><p id="control.i:PrimRep" class="caption collapser" onclick="toggleSection('i:PrimRep')">Instances</p><div id="section.i:PrimRep" class="show"><table><tr><td class="src"><a href="../base-4.5.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="TyCon.html#t:PrimRep">PrimRep</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="TyCon.html#t:PrimRep">PrimRep</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Outputable.html#t:Outputable">Outputable</a> <a href="TyCon.html#t:PrimRep">PrimRep</a></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:tyConPrimRep" class="def">tyConPrimRep</a> :: <a href="TyCon.html#t:TyCon">TyCon</a> -&gt; <a href="TyCon.html#t:PrimRep">PrimRep</a></p><div class="doc"><p>Find the primitive representation of a <code><a href="TyCon.html#t:TyCon">TyCon</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:primRepSizeW" class="def">primRepSizeW</a> :: <a href="TyCon.html#t:PrimRep">PrimRep</a> -&gt; <a href="../base-4.5.1.0/Data-Int.html#t:Int">Int</a></p><div class="doc"><p>Find the size of a <code><a href="TyCon.html#t:PrimRep">PrimRep</a></code>, in words
</p></div></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>