Sophie

Sophie

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

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
>CoreUtils</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_CoreUtils.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"
>CoreUtils</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"
>Constructing expressions
</A
></DT
><DT
><A HREF="#2"
>Taking expressions apart
</A
></DT
><DT
><A HREF="#3"
>Properties of expressions
</A
></DT
><DT
><A HREF="#4"
>Arity and eta expansion
</A
></DT
><DT
><A HREF="#5"
>Expression and bindings size
</A
></DT
><DT
><A HREF="#6"
>Hashing
</A
></DT
><DT
><A HREF="#7"
>Equality
</A
></DT
><DT
><A HREF="#8"
>Manipulating data constructors and types
</A
></DT
></DL
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Description</TD
></TR
><TR
><TD CLASS="doc"
>Commonly useful utilites for manipulating the Core language
</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"
><A HREF="#v%3AmkInlineMe"
>mkInlineMe</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AmkSCC"
>mkSCC</A
> ::  <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
> -&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%3AmkCoerce"
>mkCoerce</A
> :: <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AmkCoerceI"
>mkCoerceI</A
> :: <A HREF="Coercion.html#t%3ACoercionI"
>CoercionI</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AbindNonRec"
>bindNonRec</A
> :: <A HREF="Var.html#t%3AId"
>Id</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AneedsCaseBinding"
>needsCaseBinding</A
> :: <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <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%3AmkIfThenElse"
>mkIfThenElse</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AmkAltExpr"
>mkAltExpr</A
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>] -&gt; [<A HREF="Type.html#t%3AType"
>Type</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%3AmkPiType"
>mkPiType</A
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AmkPiTypes"
>mkPiTypes</A
> :: [<A HREF="Var.html#t%3AVar"
>Var</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AfindDefault"
>findDefault</A
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; ([<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>], <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%3AfindAlt"
>findAlt</A
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AisDefaultAlt"
>isDefaultAlt</A
> :: <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</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%3AmergeAlts"
>mergeAlts</A
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AtrimConArgs"
>trimConArgs</A
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreArg"
>CoreArg</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreArg"
>CoreArg</A
>]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AexprType"
>exprType</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcoreAltType"
>coreAltType</A
> :: <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AcoreAltsType"
>coreAltsType</A
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AexprIsDupable"
>exprIsDupable</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%3AexprIsTrivial"
>exprIsTrivial</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%3AexprIsCheap"
>exprIsCheap</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%3AexprIsHNF"
>exprIsHNF</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%3AexprOkForSpeculation"
>exprOkForSpeculation</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%3AexprIsBig"
>exprIsBig</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%3AexprIsConApp_maybe"
>exprIsConApp_maybe</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> (<A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
>, [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>])</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AexprIsBottom"
>exprIsBottom</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%3ArhsIsStatic"
>rhsIsStatic</A
> :: <A HREF="Module.html#t%3APackageId"
>PackageId</A
> -&gt; <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%3AmanifestArity"
>manifestArity</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AexprArity"
>exprArity</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AexprEtaExpandArity"
>exprEtaExpandArity</A
> :: <A HREF="DynFlags.html#t%3ADynFlags"
>DynFlags</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AetaExpand"
>etaExpand</A
> :: <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
> -&gt; [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</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%3AcoreBindsSize"
>coreBindsSize</A
> :: [<A HREF="CoreSyn.html#t%3ACoreBind"
>CoreBind</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%3AexprSize"
>exprSize</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AhashExpr"
>hashExpr</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</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%3AcheapEqExpr"
>cheapEqExpr</A
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <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%3AtcEqExpr"
>tcEqExpr</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <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%3AtcEqExprX"
>tcEqExprX</A
> :: <A HREF="VarEnv.html#t%3ARnEnv2"
>RnEnv2</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <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%3AapplyTypeToArgs"
>applyTypeToArgs</A
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AapplyTypeToArg"
>applyTypeToArg</A
> :: <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdataConOrigInstPat"
>dataConOrigInstPat</A
> :: [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>])</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdataConRepInstPat"
>dataConRepInstPat</A
> :: [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>])</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AdataConRepFSInstPat"
>dataConRepFSInstPat</A
> :: [<A HREF="FastString.html#t%3AFastString"
>FastString</A
>] -&gt; [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</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"
>Constructing expressions
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkInlineMe"
><A NAME="v%3AmkInlineMe"
></A
></A
><B
>mkInlineMe</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Wraps the given expression in an inlining hint unless the expression
 is trivial in some sense, so that doing so would usually hurt us
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkSCC"
><A NAME="v%3AmkSCC"
></A
></A
><B
>mkSCC</B
> ::  <A HREF="CostCentre.html#t%3ACostCentre"
>CostCentre</A
> -&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"
>Wraps the given expression in the cost centre unless
 in a way that maximises their utility to the user
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkCoerce"
><A NAME="v%3AmkCoerce"
></A
></A
><B
>mkCoerce</B
> :: <A HREF="Coercion.html#t%3ACoercion"
>Coercion</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Wrap the given expression in the coercion safely, coalescing nested coercions
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkCoerceI"
><A NAME="v%3AmkCoerceI"
></A
></A
><B
>mkCoerceI</B
> :: <A HREF="Coercion.html#t%3ACoercionI"
>CoercionI</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
>Wrap the given expression in the coercion, dropping identity coercions and coalescing nested coercions
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:bindNonRec"
><A NAME="v%3AbindNonRec"
></A
></A
><B
>bindNonRec</B
> :: <A HREF="Var.html#t%3AId"
>Id</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="doc"
><P
><TT
>bindNonRec x r b</TT
> produces either:
</P
><PRE
> let x = r in b
</PRE
><P
>or:
</P
><PRE
> case r of x { _DEFAULT_ -&gt; b }
</PRE
><P
>depending on whether we have to use a <TT
>case</TT
> or <TT
>let</TT
>
 binding for the expression (see <TT
><A HREF="CoreUtils.html#v%3AneedsCaseBinding"
>needsCaseBinding</A
></TT
>).
 It's used by the desugarer to avoid building bindings
 that give Core Lint a heart attack, although actually
 the simplifier deals with them perfectly well. See
 also MkCore.mkCoreLet
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:needsCaseBinding"
><A NAME="v%3AneedsCaseBinding"
></A
></A
><B
>needsCaseBinding</B
> :: <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <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"
>Tests whether we have to use a <TT
>case</TT
> rather than <TT
>let</TT
> binding for this expression
 as per the invariants of <TT
><A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TT
>: see <A HREF="CoreSyn.html#let_app_invariant"
>CoreSyn</A
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkIfThenElse"
><A NAME="v%3AmkIfThenElse"
></A
></A
><B
>mkIfThenElse</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkAltExpr"
><A NAME="v%3AmkAltExpr"
></A
></A
><B
>mkAltExpr</B
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="arg"
>:: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
></TD
><TD CLASS="rdoc"
>Case alternative constructor
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; [<A HREF="CoreSyn.html#t%3ACoreBndr"
>CoreBndr</A
>]</TD
><TD CLASS="rdoc"
>Things bound by the pattern match
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>]</TD
><TD CLASS="rdoc"
>The type arguments to the case alternative
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="ndoc" COLSPAN="2"
>This guy constructs the value that the scrutinee must have
 given that you are in one particular branch of a case
</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkPiType"
><A NAME="v%3AmkPiType"
></A
></A
><B
>mkPiType</B
> :: <A HREF="Var.html#t%3AVar"
>Var</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>Makes a <TT
>(-&gt;)</TT
> type or a forall type, depending
 on whether it is given a type variable or a term variable.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:mkPiTypes"
><A NAME="v%3AmkPiTypes"
></A
></A
><B
>mkPiTypes</B
> :: [<A HREF="Var.html#t%3AVar"
>Var</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
><TT
><A HREF="CoreUtils.html#v%3AmkPiType"
>mkPiType</A
></TT
> for multiple type or value arguments
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="2"
><A NAME="2"
>Taking expressions apart
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:findDefault"
><A NAME="v%3AfindDefault"
></A
></A
><B
>findDefault</B
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; ([<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>], <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>)</TD
></TR
><TR
><TD CLASS="doc"
>Extract the default case alternative
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:findAlt"
><A NAME="v%3AfindAlt"
></A
></A
><B
>findAlt</B
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
></TD
></TR
><TR
><TD CLASS="doc"
>Find the case alternative corresponding to a particular 
 constructor: panics if no such constructor exists
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:isDefaultAlt"
><A NAME="v%3AisDefaultAlt"
></A
></A
><B
>isDefaultAlt</B
> :: <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</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:mergeAlts"
><A NAME="v%3AmergeAlts"
></A
></A
><B
>mergeAlts</B
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>]</TD
></TR
><TR
><TD CLASS="doc"
>Merge alternatives preserving order; alternatives in
 the first argument shadow ones in the second
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:trimConArgs"
><A NAME="v%3AtrimConArgs"
></A
></A
><B
>trimConArgs</B
> :: <A HREF="CoreSyn.html#t%3AAltCon"
>AltCon</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreArg"
>CoreArg</A
>] -&gt; [<A HREF="CoreSyn.html#t%3ACoreArg"
>CoreArg</A
>]</TD
></TR
><TR
><TD CLASS="doc"
><P
>Given:
</P
><PRE
> case (C a b x y) of
        C b x y -&gt; ...
</PRE
><P
>We want to drop the leading type argument of the scrutinee
 leaving the arguments to match agains the pattern
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="3"
><A NAME="3"
>Properties of expressions
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprType"
><A NAME="v%3AexprType"
></A
></A
><B
>exprType</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>Recover the type of a well-typed Core expression. Fails when
 applied to the actual <TT
><A HREF="CoreSyn.html#v%3AType"
>Type</A
></TT
> expression as it cannot
 really be said to have a type
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:coreAltType"
><A NAME="v%3AcoreAltType"
></A
></A
><B
>coreAltType</B
> :: <A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>Returns the type of the alternatives right hand side
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:coreAltsType"
><A NAME="v%3AcoreAltsType"
></A
></A
><B
>coreAltsType</B
> :: [<A HREF="CoreSyn.html#t%3ACoreAlt"
>CoreAlt</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>Returns the type of the first alternative, which should be the same as for all alternatives
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsDupable"
><A NAME="v%3AexprIsDupable"
></A
></A
><B
>exprIsDupable</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="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsTrivial"
><A NAME="v%3AexprIsTrivial"
></A
></A
><B
>exprIsTrivial</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="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsCheap"
><A NAME="v%3AexprIsCheap"
></A
></A
><B
>exprIsCheap</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="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsHNF"
><A NAME="v%3AexprIsHNF"
></A
></A
><B
>exprIsHNF</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"
><P
>This returns true for expressions that are certainly <EM
>already</EM
> 
 evaluated to <EM
>head</EM
> normal form.  This is used to decide whether it's ok 
 to change:
</P
><PRE
> case x of _ -&gt; e
</PRE
><P
>into:
</P
><PRE
> e
</PRE
><P
>and to decide whether it's safe to discard a <TT
><A HREF="../ghc-prim/GHC-Prim.html#v%3Aseq"
>seq</A
></TT
>.
 So, it does <EM
>not</EM
> treat variables as evaluated, unless they say they are.
 However, it <EM
>does</EM
> treat partial applications and constructor applications
 as values, even if their arguments are non-trivial, provided the argument
 type is lifted. For example, both of these are values:
</P
><PRE
> (:) (f x) (map f xs)
 map (...redex...)
</PRE
><P
>Because <TT
><A HREF="../ghc-prim/GHC-Prim.html#v%3Aseq"
>seq</A
></TT
> on such things completes immediately.
</P
><P
>For unlifted argument types, we have to be careful:
</P
><PRE
> C (f x :: Int#)
</PRE
><P
>Suppose <TT
>f x</TT
> diverges; then <TT
>C (f x)</TT
> is not a value. However this can't 
 happen: see <A HREF="CoreSyn.html#let_app_invariant"
>CoreSyn</A
>. This invariant states that arguments of
 unboxed type must be ok-for-speculation (or trivial).
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprOkForSpeculation"
><A NAME="v%3AexprOkForSpeculation"
></A
></A
><B
>exprOkForSpeculation</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"
><P
><TT
><A HREF="CoreUtils.html#v%3AexprOkForSpeculation"
>exprOkForSpeculation</A
></TT
> returns True of an expression that is:
</P
><UL
><LI
> Safe to evaluate even if normal order eval might not 
    evaluate the expression at all, or
</LI
><LI
> Safe <EM
>not</EM
> to evaluate even if normal order would do so
</LI
></UL
><P
>Precisely, it returns <TT
>True</TT
> iff:
</P
><UL
><LI
> The expression guarantees to terminate, 
</LI
><LI
> soon, 
</LI
><LI
> without raising an exception,
</LI
><LI
> without causing a side effect (e.g. writing a mutable variable)
</LI
></UL
><P
>Note that if <TT
>exprIsHNF e</TT
>, then <TT
>exprOkForSpecuation e</TT
>.
 As an example of the considerations in this test, consider:
</P
><PRE
> let x = case y# +# 1# of { r# -&gt; I# r# }
 in E
</PRE
><P
>being translated to:
</P
><PRE
> case y# +# 1# of { r# -&gt; 
    let x = I# r#
    in E 
 }
</PRE
><P
>We can only do this if the <TT
>y + 1</TT
> is ok for speculation: it has no
 side effects, and can't diverge or raise an exception.
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsBig"
><A NAME="v%3AexprIsBig"
></A
></A
><B
>exprIsBig</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
> of expressions that are too big to be compared by <TT
><A HREF="CoreUtils.html#v%3AcheapEqExpr"
>cheapEqExpr</A
></TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsConApp_maybe"
><A NAME="v%3AexprIsConApp_maybe"
></A
></A
><B
>exprIsConApp_maybe</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../base/Data-Maybe.html#t%3AMaybe"
>Maybe</A
> (<A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
>, [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>])</TD
></TR
><TR
><TD CLASS="doc"
><P
>Returns <TT
>Just (dc, [x1..xn])</TT
> if the argument expression is 
 a constructor application of the form <TT
>dc x1 .. xn</TT
>
</P
><P
>The Arity returned is the number of value args the 
 expression can be applied to without doing much work
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprIsBottom"
><A NAME="v%3AexprIsBottom"
></A
></A
><B
>exprIsBottom</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"
>True of expressions that are guaranteed to diverge upon execution
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:rhsIsStatic"
><A NAME="v%3ArhsIsStatic"
></A
></A
><B
>rhsIsStatic</B
> :: <A HREF="Module.html#t%3APackageId"
>PackageId</A
> -&gt; <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"
>This function is called only on *top-level* right-hand sides.
 Returns <TT
>True</TT
> if the RHS can be allocated statically in the output,
 with no thunks involved at all.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="4"
><A NAME="4"
>Arity and eta expansion
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:manifestArity"
><A NAME="v%3AmanifestArity"
></A
></A
><B
>manifestArity</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprArity"
><A NAME="v%3AexprArity"
></A
></A
><B
>exprArity</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="doc"
>An approximate, fast, version of <TT
><A HREF="CoreUtils.html#v%3AexprEtaExpandArity"
>exprEtaExpandArity</A
></TT
>
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprEtaExpandArity"
><A NAME="v%3AexprEtaExpandArity"
></A
></A
><B
>exprEtaExpandArity</B
> :: <A HREF="DynFlags.html#t%3ADynFlags"
>DynFlags</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:etaExpand"
><A NAME="v%3AetaExpand"
></A
></A
><B
>etaExpand</B
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="arg"
>:: <A HREF="BasicTypes.html#t%3AArity"
>Arity</A
></TD
><TD CLASS="rdoc"
>Result should have this number of value args
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>]</TD
><TD CLASS="rdoc"
>Uniques to assign to the new binders
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
>Expression to expand
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
><TD CLASS="rdoc"
>Type of expression to expand
</TD
></TR
><TR
><TD CLASS="arg"
>-&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="ndoc" COLSPAN="2"
><P
><TT
>etaExpand n us e ty</TT
> returns an expression with
 the same meaning as <TT
>e</TT
>, but with arity <TT
>n</TT
>.
</P
><P
>Given:
</P
><PRE
> e' = etaExpand n us e ty
</PRE
><P
>We should have that:
</P
><PRE
> ty = exprType e = exprType e'
</PRE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="5"
><A NAME="5"
>Expression and bindings size
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:coreBindsSize"
><A NAME="v%3AcoreBindsSize"
></A
></A
><B
>coreBindsSize</B
> :: [<A HREF="CoreSyn.html#t%3ACoreBind"
>CoreBind</A
>] -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:exprSize"
><A NAME="v%3AexprSize"
></A
></A
><B
>exprSize</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="doc"
>A measure of the size of the expressions, strictly greater than 0
 It also forces the expression pretty drastically as a side effect
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="6"
><A NAME="6"
>Hashing
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:hashExpr"
><A NAME="v%3AhashExpr"
></A
></A
><B
>hashExpr</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="../ghc-prim/GHC-Types.html#t%3AInt"
>Int</A
></TD
></TR
><TR
><TD CLASS="doc"
><P
>Two expressions that hash to the same <TT
>Int</TT
> may be equal (but may not be)
 Two expressions that hash to the different Ints are definitely unequal.
</P
><P
>The emphasis is on a crude, fast hash, rather than on high precision.
</P
><P
>But unequal here means &quot;not identical&quot;; two alpha-equivalent 
 expressions may hash to the different Ints.
</P
><P
>We must be careful that <TT
>\x.x</TT
> and <TT
>\y.y</TT
> map to the same hash code,
 (at least if we want the above invariant to be true).
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="7"
><A NAME="7"
>Equality
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:cheapEqExpr"
><A NAME="v%3AcheapEqExpr"
></A
></A
><B
>cheapEqExpr</B
> ::  <A HREF="CoreSyn.html#t%3AExpr"
>Expr</A
> b -&gt; <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"
><P
>A cheap equality test which bales out fast!
      If it returns <TT
>True</TT
> the arguments are definitely equal,
      otherwise, they may or may not be equal.
</P
><P
>See also <TT
><A HREF="CoreUtils.html#v%3AexprIsBig"
>exprIsBig</A
></TT
>
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:tcEqExpr"
><A NAME="v%3AtcEqExpr"
></A
></A
><B
>tcEqExpr</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <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"
>A kind of shallow equality used in rule matching, so does 
 <EM
>not</EM
> look through newtypes or predicate types
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:tcEqExprX"
><A NAME="v%3AtcEqExprX"
></A
></A
><B
>tcEqExprX</B
> :: <A HREF="VarEnv.html#t%3ARnEnv2"
>RnEnv2</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <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="s15"
></TD
></TR
><TR
><TD CLASS="section1"
><A NAME="8"
><A NAME="8"
>Manipulating data constructors and types
</A
></A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:applyTypeToArgs"
><A NAME="v%3AapplyTypeToArgs"
></A
></A
><B
>applyTypeToArgs</B
> :: <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; [<A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
>] -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>A more efficient version of <TT
><A HREF="CoreUtils.html#v%3AapplyTypeToArg"
>applyTypeToArg</A
></TT
> when we have several arguments.
 The first argument is just for debugging, and gives some context
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:applyTypeToArg"
><A NAME="v%3AapplyTypeToArg"
></A
></A
><B
>applyTypeToArg</B
> :: <A HREF="Type.html#t%3AType"
>Type</A
> -&gt; <A HREF="CoreSyn.html#t%3ACoreExpr"
>CoreExpr</A
> -&gt; <A HREF="Type.html#t%3AType"
>Type</A
></TD
></TR
><TR
><TD CLASS="doc"
>Determines the type resulting from applying an expression to a function with the given type
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:dataConOrigInstPat"
><A NAME="v%3AdataConOrigInstPat"
></A
></A
><B
>dataConOrigInstPat</B
> :: [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>])</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:dataConRepInstPat"
><A NAME="v%3AdataConRepInstPat"
></A
></A
><B
>dataConRepInstPat</B
> :: [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</A
>])</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v:dataConRepFSInstPat"
><A NAME="v%3AdataConRepFSInstPat"
></A
></A
><B
>dataConRepFSInstPat</B
> :: [<A HREF="FastString.html#t%3AFastString"
>FastString</A
>] -&gt; [<A HREF="Unique.html#t%3AUnique"
>Unique</A
>] -&gt; <A HREF="DataCon.html#t%3ADataCon"
>DataCon</A
> -&gt; [<A HREF="Type.html#t%3AType"
>Type</A
>] -&gt; ([<A HREF="Var.html#t%3ATyVar"
>TyVar</A
>], [<A HREF="Var.html#t%3ACoVar"
>CoVar</A
>], [<A HREF="Var.html#t%3AId"
>Id</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
>