Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 1f2b142b9d2ef4849a6f5316fa1c5b12 > files > 1863

ghc-6.10.4-1mdv2010.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--Rendered using the Haskell Html Library v0.2-->
<HTML
><HEAD
><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"
><TITLE
>CoreSyn</TITLE
><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css"
><SCRIPT SRC="haddock-util.js" TYPE="text/javascript"
></SCRIPT
><SCRIPT TYPE="text/javascript"
>window.onload = function () {setSynopsis("mini_CoreSyn.html")};</SCRIPT
></HEAD
><BODY
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="topbar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" "
></TD
><TD CLASS="title"
>ghc-6.10.4: The GHC API</TD
><TD CLASS="topbut"
><A HREF="index.html"
>Contents</A
></TD
><TD CLASS="topbut"
><A HREF="doc-index.html"
>Index</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="modulebar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><FONT SIZE="6"
>CoreSyn</FONT
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><B
>Contents</B
></TD
></TR
><TR
><TD
><DL
><DT
><A HREF="#1"
>Main data types
</A
></DT
><DD
><DL
><DT
><A HREF="#2"
><TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> construction
</A
></DT
><DT
><A HREF="#3"
>Simple <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> access functions and predicates
</A
></DT
></DL
></DD
><DT
><A HREF="#4"
>Unfolding data types
</A
></DT
><DD
><DL
><DT
><A HREF="#5"
>Constructing <TT
><A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TT
>s
</A
></DT
><DT
><A HREF="#6"
>Predicates and deconstruction on <TT
><A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TT
>
</A
></DT
></DL
></DD
><DT
><A HREF="#7"
>Strictness
</A
></DT
><DT
><A HREF="#8"
>Annotated expression data types
</A
></DT
><DD
><DL
><DT
><A HREF="#9"
>Operations on annotations
</A
></DT
></DL
></DD
><DT
><A HREF="#10"
>Core rule data types
</A
></DT
><DD
><DL
><DT
><A HREF="#11"
>Operations on <TT
><A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TT
>s 
</A
></DT
></DL
></DD
></DL
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Description</TD
></TR
><TR
><TD CLASS="doc"
>CoreSyn holds all the main data types for use by for the Glasgow Haskell Compiler midsection
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Synopsis</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AExpr"
>Expr</A
> b </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3AVar"
>Var</A
> <A HREF="Var.html#t%3AId"
>Id</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ALit"
>Lit</A
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AApp"
>App</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) (<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ALam"
>Lam</A
> b (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ALet"
>Let</A
> (<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b) (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ACase"
>Case</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) b <A HREF="Type.html#t%3AType"
>Type</A
> [<A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b]</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ACast"
>Cast</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ANote"
>Note</A
> <A HREF="CoreSyn.html#t%3ANote"
>Note</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AType"
>Type</A
> <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AAlt"
>Alt</A
> b = (<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>, [b], <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3ABind"
>Bind</A
> b </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3ANonRec"
>NonRec</A
> b (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ARec"
>Rec</A
> [(b, <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)]</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AAltCon"
>AltCon</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3ADataAlt"
>DataAlt</A
> <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ALitAlt"
>LitAlt</A
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ADEFAULT"
>DEFAULT</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AArg"
>Arg</A
> b = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3ANote"
>Note</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3ASCC"
>SCC</A
> <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AInlineMe"
>InlineMe</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ACoreNote"
>CoreNote</A
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ACoreExpr"
>CoreExpr</A
> = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ACoreAlt"
>CoreAlt</A
> = <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ACoreBind"
>CoreBind</A
> = <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ACoreArg"
>CoreArg</A
> = <A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ACoreBndr"
>CoreBndr</A
> = <A HREF="Var.html#t%3AVar"
>Var</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ATaggedExpr"
>TaggedExpr</A
> t = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ATaggedAlt"
>TaggedAlt</A
> t = <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ATaggedBind"
>TaggedBind</A
> t = <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ATaggedArg"
>TaggedArg</A
> t = <A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3ATaggedBndr"
>TaggedBndr</A
> t = <A HREF="#v%3ATB"
>TB</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
> t</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkLets"
>mkLets</A
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkLams"
>mkLams</A
> ::  [b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkApps"
>mkApps</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkTyApps"
>mkTyApps</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkVarApps"
>mkVarApps</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="Var.html#t%3AVar"
>Var</A
>] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkIntLit"
>mkIntLit</A
> ::  <A HREF="../integer/GHC-Integer.html#t%3AInteger"
>Integer</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkIntLitInt"
>mkIntLitInt</A
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkWordLit"
>mkWordLit</A
> ::  <A HREF="../integer/GHC-Integer.html#t%3AInteger"
>Integer</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkWordLitWord"
>mkWordLitWord</A
> ::  <A HREF="../base/Data-Word.html#t%3AWord"
>Word</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkCharLit"
>mkCharLit</A
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AChar"
>Char</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkStringLit"
>mkStringLit</A
> ::  <A HREF="../base/Data-Char.html#t%3AString"
>String</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkFloatLit"
>mkFloatLit</A
> ::  <A HREF="../base/Prelude.html#t%3ARational"
>Rational</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkFloatLitFloat"
>mkFloatLitFloat</A
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AFloat"
>Float</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkDoubleLit"
>mkDoubleLit</A
> ::  <A HREF="../base/Prelude.html#t%3ARational"
>Rational</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkDoubleLitDouble"
>mkDoubleLitDouble</A
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3ADouble"
>Double</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkConApp"
>mkConApp</A
> ::  <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkTyBind"
>mkTyBind</A
> :: <A HREF="Var.html#t%3ATyVar"
>TyVar</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreBind"
>CoreBind</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AvarToCoreExpr"
>varToCoreExpr</A
> ::  <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AvarsToCoreExprs"
>varsToCoreExprs</A
> ::  [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>] -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisTyVar"
>isTyVar</A
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisIdVar"
>isIdVar</A
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcmpAltCon"
>cmpAltCon</A
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; <A HREF="../ghc-prim/GHC-Ordering.html#t%3AOrdering"
>Ordering</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcmpAlt"
>cmpAlt</A
> ::  <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="../ghc-prim/GHC-Ordering.html#t%3AOrdering"
>Ordering</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AltAlt"
>ltAlt</A
> ::  <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AbindersOf"
>bindersOf</A
> ::  <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b -&gt; [b]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AbindersOfBinds"
>bindersOfBinds</A
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; [b]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArhssOfBind"
>rhssOfBind</A
> ::  <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArhssOfAlts"
>rhssOfAlts</A
> ::  [<A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b] -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectBinders"
>collectBinders</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; ([b], <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectTyBinders"
>collectTyBinders</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectValBinders"
>collectValBinders</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3AId"
>Id</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectTyAndValBinders"
>collectTyAndValBinders</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectArgs"
>collectArgs</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b, [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b])</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcoreExprCc"
>coreExprCc</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AflattenBinds"
>flattenBinds</A
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; [(b, <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisValArg"
>isValArg</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisTypeArg"
>isTypeArg</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AvalArgCount"
>valArgCount</A
> ::  [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AvalBndrCount"
>valBndrCount</A
> :: [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>] -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisRuntimeArg"
>isRuntimeArg</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisRuntimeVar"
>isRuntimeVar</A
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AUnfolding"
>Unfolding</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3ANoUnfolding"
>NoUnfolding</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AOtherCon"
>OtherCon</A
> [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>]</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ACompulsoryUnfolding"
>CompulsoryUnfolding</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ACoreUnfolding"
>CoreUnfolding</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="CoreSyn.html#t%3AUnfoldingGuidance"
>UnfoldingGuidance</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AUnfoldingGuidance"
>UnfoldingGuidance</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3AUnfoldNever"
>UnfoldNever</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AUnfoldIfGoodArgs"
>UnfoldIfGoodArgs</A
> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> [<A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
>] <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AnoUnfolding"
>noUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AevaldUnfolding"
>evaldUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkOtherCon"
>mkOtherCon</A
> :: [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>] -&gt; <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AunfoldingTemplate"
>unfoldingTemplate</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmaybeUnfoldingTemplate"
>maybeUnfoldingTemplate</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AotherCons"
>otherCons</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisValueUnfolding"
>isValueUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisEvaldUnfolding"
>isEvaldUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisCheapUnfolding"
>isCheapUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisCompulsoryUnfolding"
>isCompulsoryUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AhasUnfolding"
>hasUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AhasSomeUnfolding"
>hasSomeUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AneverUnfold"
>neverUnfold</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AseqExpr"
>seqExpr</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AseqExprs"
>seqExprs</A
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AseqUnfolding"
>seqUnfolding</A
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AAnnExpr"
>AnnExpr</A
> bndr annot = (annot, <A HREF="CoreSyn.html#t%3AAnnExpr%27"
>AnnExpr'</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AAnnExpr%27"
>AnnExpr'</A
> bndr annot </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3AAnnVar"
>AnnVar</A
> <A HREF="Var.html#t%3AId"
>Id</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnLit"
>AnnLit</A
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnLam"
>AnnLam</A
> bndr (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnApp"
>AnnApp</A
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnCase"
>AnnCase</A
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) bndr <A HREF="Type.html#t%3AType"
>Type</A
> [<A HREF="CoreSyn.html#t%3AAnnAlt"
>AnnAlt</A
> bndr annot]</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnLet"
>AnnLet</A
> (<A HREF="CoreSyn.html#t%3AAnnBind"
>AnnBind</A
> bndr annot) (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnCast"
>AnnCast</A
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
></TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnNote"
>AnnNote</A
> <A HREF="CoreSyn.html#t%3ANote"
>Note</A
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnType"
>AnnType</A
> <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3AAnnBind"
>AnnBind</A
> bndr annot </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3AAnnNonRec"
>AnnNonRec</A
> bndr (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3AAnnRec"
>AnnRec</A
> [(bndr, <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)]</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3AAnnAlt"
>AnnAlt</A
> bndr annot = (<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>, [bndr], <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdeAnnotate"
>deAnnotate</A
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> bndr</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdeAnnotate%27"
>deAnnotate'</A
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr%27"
>AnnExpr'</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> bndr</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdeAnnAlt"
>deAnnAlt</A
> ::  <A HREF="CoreSyn.html#t%3AAnnAlt"
>AnnAlt</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> bndr</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcollectAnnBndrs"
>collectAnnBndrs</A
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot -&gt; ([bndr], <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A HREF="#t%3ACoreRule"
>CoreRule</A
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
>= <A HREF="#v%3ARule"
>Rule</A
> {<TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_name"
>ru_name</A
> :: <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_act"
>ru_act</A
> :: <A HREF="BasicTypes.html#t%3AActivation"
>Activation</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_fn"
>ru_fn</A
> :: <A HREF="Name.html#t%3AName"
>Name</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_rough"
>ru_rough</A
> :: [<A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="Name.html#t%3AName"
>Name</A
>]</TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_bndrs"
>ru_bndrs</A
> :: [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>]</TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_args"
>ru_args</A
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>]</TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_rhs"
>ru_rhs</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_local"
>ru_local</A
> :: <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
></TABLE
>}</TD
></TR
><TR
><TD CLASS="decl"
>| <A HREF="#v%3ABuiltinRule"
>BuiltinRule</A
> {<TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_name"
>ru_name</A
> :: <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_fn"
>ru_fn</A
> :: <A HREF="Name.html#t%3AName"
>Name</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_nargs"
>ru_nargs</A
> :: <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="recfield"
><A HREF="#v%3Aru_try"
>ru_try</A
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
></TABLE
>}</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A HREF="#t%3ARuleName"
>RuleName</A
> = <A HREF="FastString.html#t%3AFastString"
>FastString</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AseqRules"
>seqRules</A
> :: [<A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
>] -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AruleArity"
>ruleArity</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AruleName"
>ruleName</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AruleIdName"
>ruleIdName</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="Name.html#t%3AName"
>Name</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AruleActivation_maybe"
>ruleActivation_maybe</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="BasicTypes.html#t%3AActivation"
>Activation</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AsetRuleIdName"
>setRuleIdName</A
> :: <A HREF="Name.html#t%3AName"
>Name</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisBuiltinRule"
>isBuiltinRule</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisLocalRule"
>isLocalRule</A
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="1"
><A NAME="1"
>Main data types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:Expr"
><A NAME="t%3AExpr"
></A
></A
><B
>Expr</B
> b </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
><P
>This is the data type that represents GHCs core intermediate language. Currently
 GHC uses System FC <A HREF="http://research.microsoft.com/~simonpj/papers/ext-f/"
>http://research.microsoft.com/~simonpj/papers/ext-f/</A
> for this purpose,
 which is closely related to the simpler and better known System F <A HREF="http://en.wikipedia.org/wiki/System_F"
>http://en.wikipedia.org/wiki/System_F</A
>.
</P
><P
>We get from Haskell source to this Core language in a number of stages:
</P
><P
>1. The source code is parsed into an abstract syntax tree, which is represented
    by the data type HsExpr.HsExpr with the names being RdrName.RdrNames
</P
><P
>2. This syntax tree is <EM
>renamed</EM
>, which attaches a Unique.Unique to every RdrName.RdrName
    (yielding a <TT
><A HREF="Name.html#t%3AName"
>Name</A
></TT
>) to disambiguate identifiers which are lexically identical. 
    For example, this program:
</P
><PRE
>
      f x = let f x = x + 1
            in f (x - 2)
</PRE
><P
>Would be renamed by having Uniques attached so it looked something like this:
</P
><PRE
>
      f_1 x_2 = let f_3 x_4 = x_4 + 1
                in f_3 (x_2 - 2)
</PRE
><P
>3. The resulting syntax tree undergoes type checking (which also deals with instantiating
    type class arguments) to yield a HsExpr.HsExpr type that has Id.Id as it's names.
</P
><P
>4. Finally the syntax tree is <EM
>desugared</EM
> from the expressive HsExpr.HsExpr type into
    this <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> type, which has far fewer constructors and hence is easier to perform
    optimization, analysis and code generation on.
</P
><P
>The type parameter <TT
>b</TT
> is for the type of binders in the expression tree.
</P
></TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:Var"
><A NAME="v%3AVar"
></A
></A
><B
>Var</B
> <A HREF="Var.html#t%3AId"
>Id</A
></TD
><TD CLASS="rdoc"
>Variables
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Lit"
><A NAME="v%3ALit"
></A
></A
><B
>Lit</B
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
><TD CLASS="rdoc"
>Primitive literals
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:App"
><A NAME="v%3AApp"
></A
></A
><B
>App</B
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) (<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b)</TD
><TD CLASS="rdoc"
><P
>Applications: note that the argument may be a <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
>.
</P
><P
>See <A HREF="CoreSyn.html#let_app_invariant"
>CoreSyn</A
> for another invariant
</P
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Lam"
><A NAME="v%3ALam"
></A
></A
><B
>Lam</B
> b (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
><TD CLASS="rdoc"
>Lambda abstraction
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Let"
><A NAME="v%3ALet"
></A
></A
><B
>Let</B
> (<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b) (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
><TD CLASS="rdoc"
><P
>Recursive and non recursive <TT
>let</TT
>s. Operationally
 this corresponds to allocating a thunk for the things
 bound and then executing the sub-expression.
</P
><P
><A NAME="top_level_invariant"
><A NAME="top_level_invariant"
></A
></A
>
 <A NAME="letrec_invariant"
><A NAME="letrec_invariant"
></A
></A
>
</P
><P
>The right hand sides of all top-level and recursive <TT
>let</TT
>s
 <EM
>must</EM
> be of lifted type (see <A HREF="Type.html#type_classification"
>Type</A
> for
 the meaning of <EM
>lifted</EM
> vs. <EM
>unlifted</EM
>).
</P
><P
><A NAME="let_app_invariant"
><A NAME="let_app_invariant"
></A
></A
>
 The right hand side of of a non-recursive <TT
><A HREF="CoreSyn.html#v%3ALet"
>Let</A
></TT
> _and_ the argument of an <TT
><A HREF="CoreSyn.html#v%3AApp"
>App</A
></TT
>,
 <EM
>may</EM
> be of unlifted type, but only if the expression 
 is ok-for-speculation.  This means that the let can be floated around 
 without difficulty. For example, this is OK:
</P
><PRE
> y::Int# = x +# 1#
</PRE
><P
>But this is not, as it may affect termination if the expression is floated out:
</P
><PRE
> y::Int# = fac 4#
</PRE
><P
>In this situation you should use <TT
>case</TT
> rather than a <TT
>let</TT
>. The function
 CoreUtils.needsCaseBinding can help you determine which to generate, or
 alternatively use MkCore.mkCoreLet rather than this constructor directly,
 which will generate a <TT
>case</TT
> if necessary
</P
><P
><A NAME="type_let"
><A NAME="type_let"
></A
></A
>
 We allow a <EM
>non-recursive</EM
> let to bind a type variable, thus:
</P
><PRE
> Let (NonRec tv (Type ty)) body
</PRE
><P
>This can be very convenient for postponing type substitutions until
 the next run of the simplifier.
</P
><P
>At the moment, the rest of the compiler only deals with type-let
 in a Let expression, rather than at top level.  We may want to revist
 this choice.
</P
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Case"
><A NAME="v%3ACase"
></A
></A
><B
>Case</B
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) b <A HREF="Type.html#t%3AType"
>Type</A
> [<A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b]</TD
><TD CLASS="rdoc"
><P
>Case split. Operationally this corresponds to evaluating
 the scrutinee (expression examined) to weak head normal form
 and then examining at most one level of resulting constructor (i.e. you
 cannot do nested pattern matching directly with this).
</P
><P
>The binder gets bound to the value of the scrutinee,
 and the <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
> must be that of all the case alternatives
</P
><P
><A NAME="case_invariants"
><A NAME="case_invariants"
></A
></A
>
 This is one of the more complicated elements of the Core language, and comes
 with a number of restrictions:
</P
><P
>The <TT
><A HREF="CoreSyn.html#v%3ADEFAULT"
>DEFAULT</A
></TT
> case alternative must be first in the list, if it occurs at all.
</P
><P
>The remaining cases are in order of increasing 
      tag	(for DataAlts) or
      lit	(for LitAlts).
 This makes finding the relevant constructor easy, and makes comparison easier too.
</P
><P
>The list of alternatives must be exhaustive. An <EM
>exhaustive</EM
> case 
 does not necessarily mention all constructors:
</P
><PRE
>
      data Foo = Red | Green | Blue
 ... case x of 
      Red   -&gt; True
      other -&gt; f (case x of 
                      Green -&gt; ...
                      Blue  -&gt; ... ) ...
</PRE
><P
>The inner case does not need a <TT
>Red</TT
> alternative, because <TT
>x</TT
> can't be <TT
>Red</TT
> at
 that program point.
</P
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Cast"
><A NAME="v%3ACast"
></A
></A
><B
>Cast</B
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b) <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
></TD
><TD CLASS="rdoc"
>Cast an expression to a particular type. This is used to implement <TT
>newtype</TT
>s
 (a <TT
>newtype</TT
> constructor or destructor just becomes a <TT
><A HREF="CoreSyn.html#v%3ACast"
>Cast</A
></TT
> in Core) and GADTs.
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Note"
><A NAME="v%3ANote"
></A
></A
><B
>Note</B
> <A HREF="CoreSyn.html#t%3ANote"
>Note</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
><TD CLASS="rdoc"
>Notes. These allow general information to be
 added to expressions in the syntax tree
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Type"
><A NAME="v%3AType"
></A
></A
><B
>Type</B
> <A HREF="Type.html#t%3AType"
>Type</A
></TD
><TD CLASS="rdoc"
>A type: this should only show up at the top
 level of an Arg
</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Expr')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:Expr" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputableBndr"
>OutputableBndr</A
> b =&gt; <A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:Alt"
><A NAME="t%3AAlt"
></A
></A
><B
>Alt</B
> b = (<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>, [b], <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="doc"
>A case split alternative. Consists of the constructor leading to the alternative,
 the variables bound from the constructor, and the expression to be executed given that binding.
 The default alternative is <TT
>(DEFAULT, [], rhs)</TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:Bind"
><A NAME="t%3ABind"
></A
></A
><B
>Bind</B
> b </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>Binding, used for top level bindings in a module and local bindings in a <TT
>let</TT
>.
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:NonRec"
><A NAME="v%3ANonRec"
></A
></A
><B
>NonRec</B
> b (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:Rec"
><A NAME="v%3ARec"
></A
></A
><B
>Rec</B
> [(b, <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)]</TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Bind')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:Bind" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputableBndr"
>OutputableBndr</A
> b =&gt; <A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> (<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b)</TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:AltCon"
><A NAME="t%3AAltCon"
></A
></A
><B
>AltCon</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>A case alternative constructor (i.e. pattern match)
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:DataAlt"
><A NAME="v%3ADataAlt"
></A
></A
><B
>DataAlt</B
> <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
></TD
><TD CLASS="rdoc"
>A plain data constructor: <TT
>case e of { Foo x -&gt; ... }</TT
>.
 Invariant: the <TT
><A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
></TT
> is always from a <TT
>data</TT
> type, and never from a <TT
>newtype</TT
>
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:LitAlt"
><A NAME="v%3ALitAlt"
></A
></A
><B
>LitAlt</B
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
><TD CLASS="rdoc"
>A literal: <TT
>case e of { 1 -&gt; ... }</TT
>
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:DEFAULT"
><A NAME="v%3ADEFAULT"
></A
></A
><B
>DEFAULT</B
></TD
><TD CLASS="rdoc"
>Trivial alternative: <TT
>case e of { _ -&gt; ... }</TT
>
</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:AltCon')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:AltCon" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Eq.html#t%3AEq"
>Eq</A
> <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Data-Ord.html#t%3AOrd"
>Ord</A
> <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="../base/Text-Show.html#t%3AShow"
>Show</A
> <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:Arg"
><A NAME="t%3AArg"
></A
></A
><B
>Arg</B
> b = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Type synonym for expressions that occur in function argument positions.
 Only <TT
><A HREF="CoreSyn.html#t%3AArg"
>Arg</A
></TT
> should contain a <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
> at top level, general <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> should not
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:Note"
><A NAME="t%3ANote"
></A
></A
><B
>Note</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>Allows attaching extra information to points in expressions rather than e.g. identifiers.
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:SCC"
><A NAME="v%3ASCC"
></A
></A
><B
>SCC</B
> <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
></TD
><TD CLASS="rdoc"
>A cost centre annotation for profiling
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:InlineMe"
><A NAME="v%3AInlineMe"
></A
></A
><B
>InlineMe</B
></TD
><TD CLASS="rdoc"
>Instructs the core simplifer to treat the enclosed expression
 as very small, and inline it at its call sites
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:CoreNote"
><A NAME="v%3ACoreNote"
></A
></A
><B
>CoreNote</B
> <A HREF="../base/Data-Char.html#t%3AString"
>String</A
></TD
><TD CLASS="rdoc"
>A generic core annotation, propagated but not used by GHC
</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:CoreExpr"
><A NAME="t%3ACoreExpr"
></A
></A
><B
>CoreExpr</B
> = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Expressions where binders are <TT
><A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TT
>s
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:CoreAlt"
><A NAME="t%3ACoreAlt"
></A
></A
><B
>CoreAlt</B
> = <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Case alternatives where binders are <TT
><A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TT
>s
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:CoreBind"
><A NAME="t%3ACoreBind"
></A
></A
><B
>CoreBind</B
> = <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Binding groups where binders are <TT
><A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TT
>s
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:CoreArg"
><A NAME="t%3ACoreArg"
></A
></A
><B
>CoreArg</B
> = <A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Argument expressions where binders are <TT
><A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
></TT
>s
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:CoreBndr"
><A NAME="t%3ACoreBndr"
></A
></A
><B
>CoreBndr</B
> = <A HREF="Var.html#t%3AVar"
>Var</A
></TD
></TR
><TR
><TD CLASS="doc"
>The common case for the type of binders and variables when
 we are manipulating the Core language within GHC
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:TaggedExpr"
><A NAME="t%3ATaggedExpr"
></A
></A
><B
>TaggedExpr</B
> t = <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:TaggedAlt"
><A NAME="t%3ATaggedAlt"
></A
></A
><B
>TaggedAlt</B
> t = <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:TaggedBind"
><A NAME="t%3ATaggedBind"
></A
></A
><B
>TaggedBind</B
> t = <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:TaggedArg"
><A NAME="t%3ATaggedArg"
></A
></A
><B
>TaggedArg</B
> t = <A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> t)</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:TaggedBndr"
><A NAME="t%3ATaggedBndr"
></A
></A
><B
>TaggedBndr</B
> t </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>Binders are <EM
>tagged</EM
> with a t
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:TB"
><A NAME="v%3ATB"
></A
></A
><B
>TB</B
> <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
> t</TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:TaggedBndr')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:TaggedBndr" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> b =&gt; <A HREF="Outputable.html#t%3AOutputableBndr"
>OutputableBndr</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> b)</TD
></TR
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> b =&gt; <A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> (<A HREF="CoreSyn.html#t%3ATaggedBndr"
>TaggedBndr</A
> b)</TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="2"
><A NAME="2"
><TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> construction
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkLets"
><A NAME="v%3AmkLets"
></A
></A
><B
>mkLets</B
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Bind all supplied binding groups over an expression in a nested let expression. Prefer to
 use CoreUtils.mkCoreLets if possible
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkLams"
><A NAME="v%3AmkLams"
></A
></A
><B
>mkLams</B
> ::  [b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Bind all supplied binders over an expression in a nested lambda expression. Prefer to
 use CoreUtils.mkCoreLams if possible
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkApps"
><A NAME="v%3AmkApps"
></A
></A
><B
>mkApps</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Apply a list of argument expressions to a function expression in a nested fashion. Prefer to
 use CoreUtils.mkCoreApps if possible
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkTyApps"
><A NAME="v%3AmkTyApps"
></A
></A
><B
>mkTyApps</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Apply a list of type argument expressions to a function expression in a nested fashion
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkVarApps"
><A NAME="v%3AmkVarApps"
></A
></A
><B
>mkVarApps</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; [<A HREF="Var.html#t%3AVar"
>Var</A
>] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Apply a list of type or value variables to a function expression in a nested fashion
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkIntLit"
><A NAME="v%3AmkIntLit"
></A
></A
><B
>mkIntLit</B
> ::  <A HREF="../integer/GHC-Integer.html#t%3AInteger"
>Integer</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine integer literal expression of type <TT
>Int#</TT
> from an <TT
>Integer</TT
>.
 If you want an expression of type <TT
>Int</TT
> use MkCore.mkIntExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkIntLitInt"
><A NAME="v%3AmkIntLitInt"
></A
></A
><B
>mkIntLitInt</B
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine integer literal expression of type <TT
>Int#</TT
> from an <TT
>Int</TT
>.
 If you want an expression of type <TT
>Int</TT
> use MkCore.mkIntExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkWordLit"
><A NAME="v%3AmkWordLit"
></A
></A
><B
>mkWordLit</B
> ::  <A HREF="../integer/GHC-Integer.html#t%3AInteger"
>Integer</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine word literal expression of type  <TT
>Word#</TT
> from an <TT
>Integer</TT
>.
 If you want an expression of type <TT
>Word</TT
> use MkCore.mkWordExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkWordLitWord"
><A NAME="v%3AmkWordLitWord"
></A
></A
><B
>mkWordLitWord</B
> ::  <A HREF="../base/Data-Word.html#t%3AWord"
>Word</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine word literal expression of type  <TT
>Word#</TT
> from a <TT
>Word</TT
>.
 If you want an expression of type <TT
>Word</TT
> use MkCore.mkWordExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkCharLit"
><A NAME="v%3AmkCharLit"
></A
></A
><B
>mkCharLit</B
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AChar"
>Char</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine character literal expression of type <TT
>Char#</TT
>.
 If you want an expression of type <TT
>Char</TT
> use MkCore.mkCharExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkStringLit"
><A NAME="v%3AmkStringLit"
></A
></A
><B
>mkStringLit</B
> ::  <A HREF="../base/Data-Char.html#t%3AString"
>String</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine string literal expression of type <TT
>Addr#</TT
>.
 If you want an expression of type <TT
>String</TT
> use MkCore.mkStringExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkFloatLit"
><A NAME="v%3AmkFloatLit"
></A
></A
><B
>mkFloatLit</B
> ::  <A HREF="../base/Prelude.html#t%3ARational"
>Rational</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine single precision literal expression of type <TT
>Float#</TT
> from a <TT
>Rational</TT
>.
 If you want an expression of type <TT
>Float</TT
> use MkCore.mkFloatExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkFloatLitFloat"
><A NAME="v%3AmkFloatLitFloat"
></A
></A
><B
>mkFloatLitFloat</B
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3AFloat"
>Float</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine single precision literal expression of type <TT
>Float#</TT
> from a <TT
>Float</TT
>.
 If you want an expression of type <TT
>Float</TT
> use MkCore.mkFloatExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkDoubleLit"
><A NAME="v%3AmkDoubleLit"
></A
></A
><B
>mkDoubleLit</B
> ::  <A HREF="../base/Prelude.html#t%3ARational"
>Rational</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine double precision literal expression of type <TT
>Double#</TT
> from a <TT
>Rational</TT
>.
 If you want an expression of type <TT
>Double</TT
> use MkCore.mkDoubleExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkDoubleLitDouble"
><A NAME="v%3AmkDoubleLitDouble"
></A
></A
><B
>mkDoubleLitDouble</B
> ::  <A HREF="../ghc-prim/GHC-Types.html#t%3ADouble"
>Double</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Create a machine double precision literal expression of type <TT
>Double#</TT
> from a <TT
>Double</TT
>.
 If you want an expression of type <TT
>Double</TT
> use MkCore.mkDoubleExpr
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkConApp"
><A NAME="v%3AmkConApp"
></A
></A
><B
>mkConApp</B
> ::  <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Apply a list of argument expressions to a data constructor in a nested fashion. Prefer to
 use MkCore.mkCoreConApps if possible
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkTyBind"
><A NAME="v%3AmkTyBind"
></A
></A
><B
>mkTyBind</B
> :: <A HREF="Var.html#t%3ATyVar"
>TyVar</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreBind"
>CoreBind</A
></TD
></TR
><TR
><TD CLASS="doc"
>Create a binding group where a type variable is bound to a type. Per <A HREF="CoreSyn.html#type_let"
>CoreSyn</A
>,
 this can only be used to bind something in a non-recursive <TT
>let</TT
> expression
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:varToCoreExpr"
><A NAME="v%3AvarToCoreExpr"
></A
></A
><B
>varToCoreExpr</B
> ::  <A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
> -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b</TD
></TR
><TR
><TD CLASS="doc"
>Convert a binder into either a <TT
><A HREF="Var.html#t%3AVar"
>Var</A
></TT
> or <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
> <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> appropriately
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:varsToCoreExprs"
><A NAME="v%3AvarsToCoreExprs"
></A
></A
><B
>varsToCoreExprs</B
> ::  [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>] -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isTyVar"
><A NAME="v%3AisTyVar"
></A
></A
><B
>isTyVar</B
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isIdVar"
><A NAME="v%3AisIdVar"
></A
></A
><B
>isIdVar</B
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:cmpAltCon"
><A NAME="v%3AcmpAltCon"
></A
></A
><B
>cmpAltCon</B
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; <A HREF="../ghc-prim/GHC-Ordering.html#t%3AOrdering"
>Ordering</A
></TD
></TR
><TR
><TD CLASS="doc"
>Compares <TT
><A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TT
>s within a single list of alternatives
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:cmpAlt"
><A NAME="v%3AcmpAlt"
></A
></A
><B
>cmpAlt</B
> ::  <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="../ghc-prim/GHC-Ordering.html#t%3AOrdering"
>Ordering</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:ltAlt"
><A NAME="v%3AltAlt"
></A
></A
><B
>ltAlt</B
> ::  <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="3"
><A NAME="3"
>Simple <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> access functions and predicates
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:bindersOf"
><A NAME="v%3AbindersOf"
></A
></A
><B
>bindersOf</B
> ::  <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b -&gt; [b]</TD
></TR
><TR
><TD CLASS="doc"
>Extract every variable by this group
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:bindersOfBinds"
><A NAME="v%3AbindersOfBinds"
></A
></A
><B
>bindersOfBinds</B
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; [b]</TD
></TR
><TR
><TD CLASS="doc"
><TT
><A HREF="CoreSyn.html#v%3AbindersOf"
>bindersOf</A
></TT
> applied to a list of binding groups
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:rhssOfBind"
><A NAME="v%3ArhssOfBind"
></A
></A
><B
>rhssOfBind</B
> ::  <A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:rhssOfAlts"
><A NAME="v%3ArhssOfAlts"
></A
></A
><B
>rhssOfAlts</B
> ::  [<A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> b] -&gt; [<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b]</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectBinders"
><A NAME="v%3AcollectBinders"
></A
></A
><B
>collectBinders</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; ([b], <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)</TD
></TR
><TR
><TD CLASS="doc"
>We often want to strip off leading lambdas before getting down to
 business. This function is your friend.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectTyBinders"
><A NAME="v%3AcollectTyBinders"
></A
></A
><B
>collectTyBinders</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="doc"
>Collect as many type bindings as possible from the front of a nested lambda
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectValBinders"
><A NAME="v%3AcollectValBinders"
></A
></A
><B
>collectValBinders</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3AId"
>Id</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="doc"
>Collect as many value bindings as possible from the front of a nested lambda
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectTyAndValBinders"
><A NAME="v%3AcollectTyAndValBinders"
></A
></A
><B
>collectTyAndValBinders</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>], <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="doc"
>Collect type binders from the front of the lambda first, 
 then follow up by collecting as many value bindings as possible
 from the resulting stripped expression
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectArgs"
><A NAME="v%3AcollectArgs"
></A
></A
><B
>collectArgs</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; (<A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b, [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b])</TD
></TR
><TR
><TD CLASS="doc"
>Takes a nested application expression and returns the the function
 being applied and the arguments to which it is applied
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:coreExprCc"
><A NAME="v%3AcoreExprCc"
></A
></A
><B
>coreExprCc</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
></TD
></TR
><TR
><TD CLASS="doc"
>Gets the cost centre enclosing an expression, if any.
 It looks inside lambdas because <TT
>(scc &quot;foo&quot; \x.e) = \x. scc &quot;foo&quot; e</TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:flattenBinds"
><A NAME="v%3AflattenBinds"
></A
></A
><B
>flattenBinds</B
> ::  [<A HREF="CoreSyn.html#t%3ABind"
>Bind</A
> b] -&gt; [(b, <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b)]</TD
></TR
><TR
><TD CLASS="doc"
>Collapse all the bindings in the supplied groups into a single
 list of lhs/rhs pairs suitable for binding in a <TT
><A HREF="CoreSyn.html#v%3ARec"
>Rec</A
></TT
> binding group
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isValArg"
><A NAME="v%3AisValArg"
></A
></A
><B
>isValArg</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Returns <TT
>False</TT
> iff the expression is a <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
> expression at its top level
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isTypeArg"
><A NAME="v%3AisTypeArg"
></A
></A
><B
>isTypeArg</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Returns <TT
>True</TT
> iff the expression is a <TT
><A HREF="Type.html#t%3AType"
>Type</A
></TT
> expression at its top level
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:valArgCount"
><A NAME="v%3AvalArgCount"
></A
></A
><B
>valArgCount</B
> ::  [<A HREF="CoreSyn.html#t%3AArg"
>Arg</A
> b] -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="doc"
>The number of argument expressions that are values rather than types at their top level
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:valBndrCount"
><A NAME="v%3AvalBndrCount"
></A
></A
><B
>valBndrCount</B
> :: [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>] -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="doc"
>The number of binders that bind values rather than types
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isRuntimeArg"
><A NAME="v%3AisRuntimeArg"
></A
></A
><B
>isRuntimeArg</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Will this argument expression exist at runtime?
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isRuntimeVar"
><A NAME="v%3AisRuntimeVar"
></A
></A
><B
>isRuntimeVar</B
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Will this variable exist at runtime?
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="4"
><A NAME="4"
>Unfolding data types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:Unfolding"
><A NAME="t%3AUnfolding"
></A
></A
><B
>Unfolding</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>Records the <EM
>unfolding</EM
> of an identifier, which is approximately the form the
 identifier would have if we substituted its definition in for the identifier.
 This type should be treated as abstract everywhere except in <A HREF="CoreUnfold.html"
>CoreUnfold</A
>
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:NoUnfolding"
><A NAME="v%3ANoUnfolding"
></A
></A
><B
>NoUnfolding</B
></TD
><TD CLASS="rdoc"
>We have no information about the unfolding
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:OtherCon"
><A NAME="v%3AOtherCon"
></A
></A
><B
>OtherCon</B
> [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>]</TD
><TD CLASS="rdoc"
><P
>It ain't one of these constructors.
 <TT
>OtherCon xs</TT
> also indicates that something has been evaluated
 and hence there's no point in re-evaluating it.
 <TT
>OtherCon []</TT
> is used even for non-data-type values
 to indicated evaluated-ness.  Notably:
</P
><PRE
> data C = C !(Int -&gt; Int)
 case x of { C f -&gt; ... }
</PRE
><P
>Here, <TT
>f</TT
> gets an <TT
>OtherCon []</TT
> unfolding.
</P
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:CompulsoryUnfolding"
><A NAME="v%3ACompulsoryUnfolding"
></A
></A
><B
>CompulsoryUnfolding</B
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
>There is <EM
>no original definition</EM
>,
 so you'd better unfold.
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:CoreUnfolding"
><A NAME="v%3ACoreUnfolding"
></A
></A
><B
>CoreUnfolding</B
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
> <A HREF="CoreSyn.html#t%3AUnfoldingGuidance"
>UnfoldingGuidance</A
></TD
><TD CLASS="rdoc"
><P
>An unfolding with redundant cached information. Parameters:
</P
><P
>1) Template used to perform unfolding; binder-info is correct
</P
><P
>2) Is this a top level binding?
</P
><P
>3) exprIsHNF template (cached); it is ok to discard a <TT
><A HREF="../ghc-prim/GHC-Prim.html#v%3Aseq"
>seq</A
></TT
> on
     this variable
</P
><P
>4) Does this waste only a little work if we expand it inside an inlining?
     Basically this is a cached version of exprIsCheap
</P
><P
>5) Tells us about the <EM
>size</EM
> of the unfolding template
</P
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Unfolding')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:Unfolding" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:UnfoldingGuidance"
><A NAME="t%3AUnfoldingGuidance"
></A
></A
><B
>UnfoldingGuidance</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>When unfolding should take place
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:UnfoldNever"
><A NAME="v%3AUnfoldNever"
></A
></A
><B
>UnfoldNever</B
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:UnfoldIfGoodArgs"
><A NAME="v%3AUnfoldIfGoodArgs"
></A
></A
><B
>UnfoldIfGoodArgs</B
> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> [<A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
>] <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:UnfoldingGuidance')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:UnfoldingGuidance" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> <A HREF="CoreSyn.html#t%3AUnfoldingGuidance"
>UnfoldingGuidance</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="5"
><A NAME="5"
>Constructing <TT
><A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TT
>s
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:noUnfolding"
><A NAME="v%3AnoUnfolding"
></A
></A
><B
>noUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="doc"
>There is no known <TT
><A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:evaldUnfolding"
><A NAME="v%3AevaldUnfolding"
></A
></A
><B
>evaldUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="doc"
>This unfolding marks the associated thing as being evaluated
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkOtherCon"
><A NAME="v%3AmkOtherCon"
></A
></A
><B
>mkOtherCon</B
> :: [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>] -&gt; <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="6"
><A NAME="6"
>Predicates and deconstruction on <TT
><A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
></TT
>
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:unfoldingTemplate"
><A NAME="v%3AunfoldingTemplate"
></A
></A
><B
>unfoldingTemplate</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Retrieves the template of an unfolding: panics if none is known
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:maybeUnfoldingTemplate"
><A NAME="v%3AmaybeUnfoldingTemplate"
></A
></A
><B
>maybeUnfoldingTemplate</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Retrieves the template of an unfolding if possible
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:otherCons"
><A NAME="v%3AotherCons"
></A
></A
><B
>otherCons</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; [<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>]</TD
></TR
><TR
><TD CLASS="doc"
>The constructors that the unfolding could never be: 
 returns <TT
>[]</TT
> if no information is available
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isValueUnfolding"
><A NAME="v%3AisValueUnfolding"
></A
></A
><B
>isValueUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Determines if it is certainly the case that the unfolding will
 yield a value (something in HNF): returns <TT
>False</TT
> if unsure
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isEvaldUnfolding"
><A NAME="v%3AisEvaldUnfolding"
></A
></A
><B
>isEvaldUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Determines if it possibly the case that the unfolding will
 yield a value. Unlike <TT
><A HREF="CoreSyn.html#v%3AisValueUnfolding"
>isValueUnfolding</A
></TT
> it returns <TT
>True</TT
>
 for <TT
><A HREF="CoreSyn.html#v%3AOtherCon"
>OtherCon</A
></TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isCheapUnfolding"
><A NAME="v%3AisCheapUnfolding"
></A
></A
><B
>isCheapUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Is the thing we will unfold into certainly cheap?
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isCompulsoryUnfolding"
><A NAME="v%3AisCompulsoryUnfolding"
></A
></A
><B
>isCompulsoryUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Must this unfolding happen for the code to be executable?
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:hasUnfolding"
><A NAME="v%3AhasUnfolding"
></A
></A
><B
>hasUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Do we have an available or compulsory unfolding?
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:hasSomeUnfolding"
><A NAME="v%3AhasSomeUnfolding"
></A
></A
><B
>hasSomeUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Only returns False if there is no unfolding information available at all
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:neverUnfold"
><A NAME="v%3AneverUnfold"
></A
></A
><B
>neverUnfold</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="doc"
>Similar to <TT
>not . hasUnfolding</TT
>, but also returns <TT
>True</TT
>
 if it has an unfolding that says it should never occur
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="7"
><A NAME="7"
>Strictness
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:seqExpr"
><A NAME="v%3AseqExpr"
></A
></A
><B
>seqExpr</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:seqExprs"
><A NAME="v%3AseqExprs"
></A
></A
><B
>seqExprs</B
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:seqUnfolding"
><A NAME="v%3AseqUnfolding"
></A
></A
><B
>seqUnfolding</B
> :: <A HREF="CoreSyn.html#t%3AUnfolding"
>Unfolding</A
> -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="8"
><A NAME="8"
>Annotated expression data types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:AnnExpr"
><A NAME="t%3AAnnExpr"
></A
></A
><B
>AnnExpr</B
> bndr annot = (annot, <A HREF="CoreSyn.html#t%3AAnnExpr%27"
>AnnExpr'</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="doc"
>Annotated core: allows annotation at every node in the tree
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:AnnExpr'"
><A NAME="t%3AAnnExpr%27"
></A
></A
><B
>AnnExpr'</B
> bndr annot </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>A clone of the <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
> type but allowing annotation at every tree node
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:AnnVar"
><A NAME="v%3AAnnVar"
></A
></A
><B
>AnnVar</B
> <A HREF="Var.html#t%3AId"
>Id</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnLit"
><A NAME="v%3AAnnLit"
></A
></A
><B
>AnnLit</B
> <A HREF="Literal.html#t%3ALiteral"
>Literal</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnLam"
><A NAME="v%3AAnnLam"
></A
></A
><B
>AnnLam</B
> bndr (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnApp"
><A NAME="v%3AAnnApp"
></A
></A
><B
>AnnApp</B
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnCase"
><A NAME="v%3AAnnCase"
></A
></A
><B
>AnnCase</B
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) bndr <A HREF="Type.html#t%3AType"
>Type</A
> [<A HREF="CoreSyn.html#t%3AAnnAlt"
>AnnAlt</A
> bndr annot]</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnLet"
><A NAME="v%3AAnnLet"
></A
></A
><B
>AnnLet</B
> (<A HREF="CoreSyn.html#t%3AAnnBind"
>AnnBind</A
> bndr annot) (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnCast"
><A NAME="v%3AAnnCast"
></A
></A
><B
>AnnCast</B
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot) <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnNote"
><A NAME="v%3AAnnNote"
></A
></A
><B
>AnnNote</B
> <A HREF="CoreSyn.html#t%3ANote"
>Note</A
> (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnType"
><A NAME="v%3AAnnType"
></A
></A
><B
>AnnType</B
> <A HREF="Type.html#t%3AType"
>Type</A
></TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:AnnBind"
><A NAME="t%3AAnnBind"
></A
></A
><B
>AnnBind</B
> bndr annot </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>A clone of the <TT
><A HREF="CoreSyn.html#t%3ABind"
>Bind</A
></TT
> type but allowing annotation at every tree node
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:AnnNonRec"
><A NAME="v%3AAnnNonRec"
></A
></A
><B
>AnnNonRec</B
> bndr (<A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:AnnRec"
><A NAME="v%3AAnnRec"
></A
></A
><B
>AnnRec</B
> [(bndr, <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)]</TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:AnnAlt"
><A NAME="t%3AAnnAlt"
></A
></A
><B
>AnnAlt</B
> bndr annot = (<A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
>, [bndr], <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="doc"
>A clone of the <TT
><A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
></TT
> type but allowing annotation at every tree node
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="9"
><A NAME="9"
>Operations on annotations
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:deAnnotate"
><A NAME="v%3AdeAnnotate"
></A
></A
><B
>deAnnotate</B
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> bndr</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:deAnnotate'"
><A NAME="v%3AdeAnnotate%27"
></A
></A
><B
>deAnnotate'</B
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr%27"
>AnnExpr'</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> bndr</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:deAnnAlt"
><A NAME="v%3AdeAnnAlt"
></A
></A
><B
>deAnnAlt</B
> ::  <A HREF="CoreSyn.html#t%3AAnnAlt"
>AnnAlt</A
> bndr annot -&gt; <A HREF="CoreSyn.html#t%3AAlt"
>Alt</A
> bndr</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:collectAnnBndrs"
><A NAME="v%3AcollectAnnBndrs"
></A
></A
><B
>collectAnnBndrs</B
> ::  <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot -&gt; ([bndr], <A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
> bndr annot)</TD
></TR
><TR
><TD CLASS="doc"
>As <TT
><A HREF="CoreSyn.html#v%3AcollectBinders"
>collectBinders</A
></TT
> but for <TT
><A HREF="CoreSyn.html#t%3AAnnExpr"
>AnnExpr</A
></TT
> rather than <TT
><A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
></TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="10"
><A NAME="10"
>Core rule data types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
>  <A NAME="t:CoreRule"
><A NAME="t%3ACoreRule"
></A
></A
><B
>CoreRule</B
>  </TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
><P
>A <TT
><A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TT
> is:
</P
><UL
><LI
> &quot;Local&quot; if the function it is a rule for is defined in the
   same module as the rule itself.
</LI
><LI
> &quot;Orphan&quot; if nothing on the LHS is defined in the same module
   as the rule itself
</LI
></UL
></TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="5" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:Rule"
><A NAME="v%3ARule"
></A
></A
><B
>Rule</B
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="body" COLSPAN="2"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:ru_name"
><A NAME="v%3Aru_name"
></A
></A
><B
>ru_name</B
> :: <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
><TD CLASS="rdoc"
>Name of the rule, for communication with the user
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_act"
><A NAME="v%3Aru_act"
></A
></A
><B
>ru_act</B
> :: <A HREF="BasicTypes.html#t%3AActivation"
>Activation</A
></TD
><TD CLASS="rdoc"
>When the rule is active
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_fn"
><A NAME="v%3Aru_fn"
></A
></A
><B
>ru_fn</B
> :: <A HREF="Name.html#t%3AName"
>Name</A
></TD
><TD CLASS="rdoc"
>Name of the Id.Id at the head of this rule
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_rough"
><A NAME="v%3Aru_rough"
></A
></A
><B
>ru_rough</B
> :: [<A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="Name.html#t%3AName"
>Name</A
>]</TD
><TD CLASS="rdoc"
>Name at the head of each argument to the left hand side
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_bndrs"
><A NAME="v%3Aru_bndrs"
></A
></A
><B
>ru_bndrs</B
> :: [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>]</TD
><TD CLASS="rdoc"
>Variables quantified over
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_args"
><A NAME="v%3Aru_args"
></A
></A
><B
>ru_args</B
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>]</TD
><TD CLASS="rdoc"
>Left hand side arguments
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_rhs"
><A NAME="v%3Aru_rhs"
></A
></A
><B
>ru_rhs</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
>Right hand side of the rule
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_local"
><A NAME="v%3Aru_local"
></A
></A
><B
>ru_local</B
> :: <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
><TD CLASS="rdoc"
><TT
>True</TT
> iff the fn at the head of the rule is
 defined in the same module as the rule
 and is not an implicit <TT
><A HREF="Var.html#t%3AId"
>Id</A
></TT
> (like a record selector,
 class operation, or data constructor)
</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:BuiltinRule"
><A NAME="v%3ABuiltinRule"
></A
></A
><B
>BuiltinRule</B
></TD
><TD CLASS="rdoc"
>Built-in rules are used for constant folding
 and suchlike.  They have no free variables.
</TD
></TR
><TR
><TD CLASS="body" COLSPAN="2"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v:ru_name"
><A NAME="v%3Aru_name"
></A
></A
><B
>ru_name</B
> :: <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
><TD CLASS="rdoc"
>As above
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_fn"
><A NAME="v%3Aru_fn"
></A
></A
><B
>ru_fn</B
> :: <A HREF="Name.html#t%3AName"
>Name</A
></TD
><TD CLASS="rdoc"
>As above
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_nargs"
><A NAME="v%3Aru_nargs"
></A
></A
><B
>ru_nargs</B
> :: <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
><TD CLASS="rdoc"
>Number of arguments that <TT
><A HREF="CoreSyn.html#v%3Aru_try"
>ru_try</A
></TT
> expects,
 including type arguments
</TD
></TR
><TR
><TD CLASS="arg"
><A NAME="v:ru_try"
><A NAME="v%3Aru_try"
></A
></A
><B
>ru_try</B
> :: [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
>This function does the rewrite.  It given too many
 arguments, it simply discards them; the returned <TT
><A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TT
>
 is just the rewrite of <TT
><A HREF="CoreSyn.html#v%3Aru_fn"
>ru_fn</A
></TT
> applied to the first <TT
><A HREF="CoreSyn.html#v%3Aru_nargs"
>ru_nargs</A
></TT
> args
</TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:CoreRule')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:CoreRule" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
><A HREF="Outputable.html#t%3AOutputable"
>Outputable</A
> <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>type</SPAN
> <A NAME="t:RuleName"
><A NAME="t%3ARuleName"
></A
></A
><B
>RuleName</B
> = <A HREF="FastString.html#t%3AFastString"
>FastString</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="11"
><A NAME="11"
>Operations on <TT
><A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TT
>s 
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:seqRules"
><A NAME="v%3AseqRules"
></A
></A
><B
>seqRules</B
> :: [<A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
>] -&gt; <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29"
>()</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:ruleArity"
><A NAME="v%3AruleArity"
></A
></A
><B
>ruleArity</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="doc"
>The number of arguments the <TT
><A HREF="CoreSyn.html#v%3Aru_fn"
>ru_fn</A
></TT
> must be applied 
 to before the rule can match on it
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:ruleName"
><A NAME="v%3AruleName"
></A
></A
><B
>ruleName</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="CoreSyn.html#t%3ARuleName"
>RuleName</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:ruleIdName"
><A NAME="v%3AruleIdName"
></A
></A
><B
>ruleIdName</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="Name.html#t%3AName"
>Name</A
></TD
></TR
><TR
><TD CLASS="doc"
>The <TT
><A HREF="Name.html#t%3AName"
>Name</A
></TT
> of the Id.Id at the head of the rule left hand side
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:ruleActivation_maybe"
><A NAME="v%3AruleActivation_maybe"
></A
></A
><B
>ruleActivation_maybe</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="BasicTypes.html#t%3AActivation"
>Activation</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:setRuleIdName"
><A NAME="v%3AsetRuleIdName"
></A
></A
><B
>setRuleIdName</B
> :: <A HREF="Name.html#t%3AName"
>Name</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
></TD
></TR
><TR
><TD CLASS="doc"
>Set the <TT
><A HREF="Name.html#t%3AName"
>Name</A
></TT
> of the Id.Id at the head of the rule left hand side
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isBuiltinRule"
><A NAME="v%3AisBuiltinRule"
></A
></A
><B
>isBuiltinRule</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isLocalRule"
><A NAME="v%3AisLocalRule"
></A
></A
><B
>isLocalRule</B
> :: <A HREF="CoreSyn.html#t%3ACoreRule"
>CoreRule</A
> -&gt; <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool"
>Bool</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="botbar"
>Produced by <A HREF="http://www.haskell.org/haddock/"
>Haddock</A
> version 2.4.2</TD
></TR
></TABLE
></BODY
></HTML
>