<!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.12.3: The GHC API</TD ><TD CLASS="topbut" ><A HREF="src/CoreUtils.html" >Source code</A ></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" >Expression and bindings size </A ></DT ><DT ><A HREF="#5" >Hashing </A ></DT ><DT ><A HREF="#6" >Equality </A ></DT ><DT ><A HREF="#7" >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 > -> <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 > -> <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > 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%3AmkCoerce" >mkCoerce</A > :: <A HREF="Coercion.html#t%3ACoercion" >Coercion</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <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 > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <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 > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <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 > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</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 > -> [<A HREF="CoreSyn.html#t%3ACoreBndr" >CoreBndr</A >] -> [<A HREF="Type.html#t%3AType" >Type</A >] -> <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 > -> <A HREF="Type.html#t%3AType" >Type</A > -> <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 >] -> <A HREF="Type.html#t%3AType" >Type</A > -> <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 >] -> ([<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >], <A HREF="../base-4.2.0.2/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 > -> [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> <A HREF="../base-4.2.0.2/Data-Maybe.html#t%3AMaybe" >Maybe</A > <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 > -> <A HREF="../base-4.2.0.2/Data-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 >] -> [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> [<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 > -> [<A HREF="CoreSyn.html#t%3ACoreArg" >CoreArg</A >] -> [<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 > -> <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 > -> <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 >] -> <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 > -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AexprIsExpandable" >exprIsExpandable</A > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="../base-4.2.0.2/Data-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 -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="../base-4.2.0.2/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 > -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</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 >] -> <A HREF="../base-4.2.0.2/Data-Int.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 > -> <A HREF="../base-4.2.0.2/Data-Int.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 > -> <A HREF="../base-4.2.0.2/Data-Int.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 -> <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b -> <A HREF="../base-4.2.0.2/Data-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 > -> <A HREF="Type.html#t%3AType" >Type</A > -> [<A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A >] -> <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 > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <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 >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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 >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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 >] -> [<A HREF="Unique.html#t%3AUnique" >Unique</A >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkInlineMe" ><A NAME="v%3AmkInlineMe" ></A ></A ><B >mkInlineMe</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkInlineMe" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkSCC" ><A NAME="v%3AmkSCC" ></A ></A ><B >mkSCC</B > :: <A HREF="CostCentre.html#t%3ACostCentre" >CostCentre</A > -> <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b -> <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b</TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkSCC" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkCoerce" ><A NAME="v%3AmkCoerce" ></A ></A ><B >mkCoerce</B > :: <A HREF="Coercion.html#t%3ACoercion" >Coercion</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkCoerce" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkCoerceI" ><A NAME="v%3AmkCoerceI" ></A ></A ><B >mkCoerceI</B > :: <A HREF="Coercion.html#t%3ACoercionI" >CoercionI</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkCoerceI" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:bindNonRec" ><A NAME="v%3AbindNonRec" ></A ></A ><B >bindNonRec</B > :: <A HREF="Var.html#t%3AId" >Id</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#bindNonRec" >Source</A ></TD ></TR ></TABLE ></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_ -> 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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:needsCaseBinding" ><A NAME="v%3AneedsCaseBinding" ></A ></A ><B >needsCaseBinding</B > :: <A HREF="Type.html#t%3AType" >Type</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#needsCaseBinding" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkAltExpr" ><A NAME="v%3AmkAltExpr" ></A ></A ><B >mkAltExpr</B ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkAltExpr" >Source</A ></TD ></TR ></TABLE ></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" >-> [<A HREF="CoreSyn.html#t%3ACoreBndr" >CoreBndr</A >]</TD ><TD CLASS="rdoc" >Things bound by the pattern match </TD ></TR ><TR ><TD CLASS="arg" >-> [<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" >-> <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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkPiType" ><A NAME="v%3AmkPiType" ></A ></A ><B >mkPiType</B > :: <A HREF="Var.html#t%3AVar" >Var</A > -> <A HREF="Type.html#t%3AType" >Type</A > -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkPiType" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >Makes a <TT >(->)</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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mkPiTypes" ><A NAME="v%3AmkPiTypes" ></A ></A ><B >mkPiTypes</B > :: [<A HREF="Var.html#t%3AVar" >Var</A >] -> <A HREF="Type.html#t%3AType" >Type</A > -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mkPiTypes" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:findDefault" ><A NAME="v%3AfindDefault" ></A ></A ><B >findDefault</B > :: [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> ([<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >], <A HREF="../base-4.2.0.2/Data-Maybe.html#t%3AMaybe" >Maybe</A > <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A >)</TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#findDefault" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >Extract the default case alternative </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:findAlt" ><A NAME="v%3AfindAlt" ></A ></A ><B >findAlt</B > :: <A HREF="CoreSyn.html#t%3AAltCon" >AltCon</A > -> [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> <A HREF="../base-4.2.0.2/Data-Maybe.html#t%3AMaybe" >Maybe</A > <A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#findAlt" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:isDefaultAlt" ><A NAME="v%3AisDefaultAlt" ></A ></A ><B >isDefaultAlt</B > :: <A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#isDefaultAlt" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mergeAlts" ><A NAME="v%3AmergeAlts" ></A ></A ><B >mergeAlts</B > :: [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >]</TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#mergeAlts" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:trimConArgs" ><A NAME="v%3AtrimConArgs" ></A ></A ><B >trimConArgs</B > :: <A HREF="CoreSyn.html#t%3AAltCon" >AltCon</A > -> [<A HREF="CoreSyn.html#t%3ACoreArg" >CoreArg</A >] -> [<A HREF="CoreSyn.html#t%3ACoreArg" >CoreArg</A >]</TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#trimConArgs" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" ><P >Given: </P ><PRE > case (C a b x y) of C b x y -> ... </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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprType" ><A NAME="v%3AexprType" ></A ></A ><B >exprType</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprType" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:coreAltType" ><A NAME="v%3AcoreAltType" ></A ></A ><B >coreAltType</B > :: <A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A > -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#coreAltType" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:coreAltsType" ><A NAME="v%3AcoreAltsType" ></A ></A ><B >coreAltsType</B > :: [<A HREF="CoreSyn.html#t%3ACoreAlt" >CoreAlt</A >] -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#coreAltsType" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsDupable" ><A NAME="v%3AexprIsDupable" ></A ></A ><B >exprIsDupable</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsDupable" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsTrivial" ><A NAME="v%3AexprIsTrivial" ></A ></A ><B >exprIsTrivial</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsTrivial" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsCheap" ><A NAME="v%3AexprIsCheap" ></A ></A ><B >exprIsCheap</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsCheap" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsExpandable" ><A NAME="v%3AexprIsExpandable" ></A ></A ><B >exprIsExpandable</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsExpandable" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsHNF" ><A NAME="v%3AexprIsHNF" ></A ></A ><B >exprIsHNF</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsHNF" >Source</A ></TD ></TR ></TABLE ></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 _ -> e </PRE ><P >into: </P ><PRE > e </PRE ><P >and to decide whether it's safe to discard a <TT ><A HREF="../base-4.2.0.2/Prelude.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="../base-4.2.0.2/Prelude.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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprOkForSpeculation" ><A NAME="v%3AexprOkForSpeculation" ></A ></A ><B >exprOkForSpeculation</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprOkForSpeculation" >Source</A ></TD ></TR ></TABLE ></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# -> I# r# } in E </PRE ><P >being translated to: </P ><PRE > case y# +# 1# of { r# -> 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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsBig" ><A NAME="v%3AexprIsBig" ></A ></A ><B >exprIsBig</B > :: <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsBig" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsConApp_maybe" ><A NAME="v%3AexprIsConApp_maybe" ></A ></A ><B >exprIsConApp_maybe</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Maybe.html#t%3AMaybe" >Maybe</A > (<A HREF="DataCon.html#t%3ADataCon" >DataCon</A >, [<A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A >])</TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsConApp_maybe" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >Returns <TT >Just (dc, [x1..xn])</TT > if the argument expression is a constructor application of the form <TT >dc x1 .. xn</TT > </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprIsBottom" ><A NAME="v%3AexprIsBottom" ></A ></A ><B >exprIsBottom</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprIsBottom" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:rhsIsStatic" ><A NAME="v%3ArhsIsStatic" ></A ></A ><B >rhsIsStatic</B > :: <A HREF="Module.html#t%3APackageId" >PackageId</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#rhsIsStatic" >Source</A ></TD ></TR ></TABLE ></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" >Expression and bindings size </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:coreBindsSize" ><A NAME="v%3AcoreBindsSize" ></A ></A ><B >coreBindsSize</B > :: [<A HREF="CoreSyn.html#t%3ACoreBind" >CoreBind</A >] -> <A HREF="../base-4.2.0.2/Data-Int.html#t%3AInt" >Int</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#coreBindsSize" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:exprSize" ><A NAME="v%3AexprSize" ></A ></A ><B >exprSize</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Int.html#t%3AInt" >Int</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#exprSize" >Source</A ></TD ></TR ></TABLE ></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="5" ><A NAME="5" >Hashing </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:hashExpr" ><A NAME="v%3AhashExpr" ></A ></A ><B >hashExpr</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="../base-4.2.0.2/Data-Int.html#t%3AInt" >Int</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#hashExpr" >Source</A ></TD ></TR ></TABLE ></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 "not identical"; 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="6" ><A NAME="6" >Equality </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:cheapEqExpr" ><A NAME="v%3AcheapEqExpr" ></A ></A ><B >cheapEqExpr</B > :: <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b -> <A HREF="CoreSyn.html#t%3AExpr" >Expr</A > b -> <A HREF="../base-4.2.0.2/Data-Bool.html#t%3ABool" >Bool</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#cheapEqExpr" >Source</A ></TD ></TR ></TABLE ></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="section1" ><A NAME="7" ><A NAME="7" >Manipulating data constructors and types </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:applyTypeToArgs" ><A NAME="v%3AapplyTypeToArgs" ></A ></A ><B >applyTypeToArgs</B > :: <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="Type.html#t%3AType" >Type</A > -> [<A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A >] -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#applyTypeToArgs" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:applyTypeToArg" ><A NAME="v%3AapplyTypeToArg" ></A ></A ><B >applyTypeToArg</B > :: <A HREF="Type.html#t%3AType" >Type</A > -> <A HREF="CoreSyn.html#t%3ACoreExpr" >CoreExpr</A > -> <A HREF="Type.html#t%3AType" >Type</A ></TD ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#applyTypeToArg" >Source</A ></TD ></TR ></TABLE ></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="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:dataConOrigInstPat" ><A NAME="v%3AdataConOrigInstPat" ></A ></A ><B >dataConOrigInstPat</B > :: [<A HREF="Unique.html#t%3AUnique" >Unique</A >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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 ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#dataConOrigInstPat" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:dataConRepInstPat" ><A NAME="v%3AdataConRepInstPat" ></A ></A ><B >dataConRepInstPat</B > :: [<A HREF="Unique.html#t%3AUnique" >Unique</A >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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 ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#dataConRepInstPat" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:dataConRepFSInstPat" ><A NAME="v%3AdataConRepFSInstPat" ></A ></A ><B >dataConRepFSInstPat</B > :: [<A HREF="FastString.html#t%3AFastString" >FastString</A >] -> [<A HREF="Unique.html#t%3AUnique" >Unique</A >] -> <A HREF="DataCon.html#t%3ADataCon" >DataCon</A > -> [<A HREF="Type.html#t%3AType" >Type</A >] -> ([<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 ><TD CLASS="declbut" ><A HREF="src/CoreUtils.html#dataConRepFSInstPat" >Source</A ></TD ></TR ></TABLE ></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.6.1</TD ></TR ></TABLE ></BODY ></HTML >