Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1772

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>deSugar/MatchLit.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

Pattern-matching literal patterns

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>MatchLit</span> <span class='hs-layout'>(</span> <span class='hs-varid'>dsLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>dsOverLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>hsLitKey</span><span class='hs-layout'>,</span> <span class='hs-varid'>hsOverLitKey</span><span class='hs-layout'>,</span>
<a name="line-2"></a>		  <span class='hs-varid'>tidyLitPat</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidyNPat</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>		  <span class='hs-varid'>matchLiterals</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchNPlusKPats</span><span class='hs-layout'>,</span> <span class='hs-varid'>matchNPats</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>Match</span>  <span class='hs-layout'>(</span> <span class='hs-varid'>match</span> <span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>DsExpr</span> <span class='hs-layout'>(</span> <span class='hs-varid'>dsExpr</span> <span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsMonad</span>
<a name="line-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsUtils</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-14"></a>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span>
<a name="line-17"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MkCore</span>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsSyn</span>	<span class='hs-layout'>(</span> <span class='hs-varid'>shortCutLit</span> <span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Literal</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
</pre>\end{code}

%************************************************************************
%*									*
		Desugaring literals
	[used to be in DsExpr, but DsMeta needs it,
	 and it's nice to avoid a loop]
%*									*
%************************************************************************

We give int/float literals type @Integer@ and @Rational@, respectively.
The typechecker will (presumably) have put \tr{from{Integer,Rational}s}
around them.

ToDo: put in range checks for when converting ``@i@''
(or should that be in the typechecker?)

For numeric literals, we try to detect there use at a standard type
(@Int@, @Float@, etc.) are directly put in the right constructor.
[NB: down with the @App@ conversion.]

See also below where we look for @DictApps@ for \tr{plusInt}, etc.

\begin{code}
<pre><a name="line-1"></a><a name="dsLit"></a><span class='hs-definition'>dsLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-2"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsStringPrim</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-3"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsCharPrim</span>   <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-4"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntPrim</span>    <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-5"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsWordPrim</span>   <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-6"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFloatPrim</span>  <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-7"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsDoublePrim</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsChar</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkCharExpr</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-10"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsString</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkStringExprFS</span> <span class='hs-varid'>str</span>
<a name="line-11"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsInteger</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkIntegerExpr</span> <span class='hs-varid'>i</span>
<a name="line-12"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkIntExpr</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-definition'>dsLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRat</span> <span class='hs-varid'>r</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-15"></a>   <span class='hs-varid'>num</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mkIntegerExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>numerator</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-16"></a>   <span class='hs-varid'>denom</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mkIntegerExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>denominator</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-17"></a>   <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkConApp</span> <span class='hs-varid'>ratio_data_con</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span> <span class='hs-varid'>integer_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>num</span><span class='hs-layout'>,</span> <span class='hs-varid'>denom</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-18"></a>  <span class='hs-keyword'>where</span>
<a name="line-19"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>ratio_data_con</span><span class='hs-layout'>,</span> <span class='hs-varid'>integer_ty</span><span class='hs-layout'>)</span> 
<a name="line-20"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>tcSplitTyConApp</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span>
<a name="line-21"></a>                <span class='hs-layout'>(</span><span class='hs-varid'>tycon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>i_ty</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span><span class='hs-varid'>isIntegerTy</span> <span class='hs-varid'>i_ty</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>tycon</span> <span class='hs-varop'>`hasKey`</span> <span class='hs-varid'>ratioTyConKey</span><span class='hs-layout'>)</span>
<a name="line-22"></a>                                   <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tycon</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>i_ty</span><span class='hs-layout'>)</span>
<a name="line-23"></a>                <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"dsLit"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="dsOverLit"></a><span class='hs-definition'>dsOverLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsOverLit</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>CoreExpr</span>
<a name="line-26"></a><span class='hs-comment'>-- Post-typechecker, the SyntaxExpr field of an OverLit contains </span>
<a name="line-27"></a><span class='hs-comment'>-- (an expression for) the literal value itself</span>
<a name="line-28"></a><span class='hs-definition'>dsOverLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>OverLit</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ol_val</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>val</span><span class='hs-layout'>,</span> <span class='hs-varid'>ol_rebindable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rebindable</span> 
<a name="line-29"></a>		   <span class='hs-layout'>,</span> <span class='hs-varid'>ol_witness</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>witness</span><span class='hs-layout'>,</span> <span class='hs-varid'>ol_type</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-30"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>not</span> <span class='hs-varid'>rebindable</span>
<a name="line-31"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>shortCutLit</span> <span class='hs-varid'>val</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>expr</span>	<span class='hs-comment'>-- Note [Literal short cut]</span>
<a name="line-32"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>			    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>witness</span>
</pre>\end{code}

Note [Literal short cut]
~~~~~~~~~~~~~~~~~~~~~~~~
The type checker tries to do this short-cutting as early as possible, but 
becuase of unification etc, more information is available to the desugarer.
And where it's possible to generate the correct literal right away, it's
much better do do so.


\begin{code}
<pre><a name="line-1"></a><a name="hsLitKey"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-2"></a><span class='hs-comment'>-- Get a Core literal to use (only) a grouping key</span>
<a name="line-3"></a><span class='hs-comment'>-- Hence its type doesn't need to match the type of the original literal</span>
<a name="line-4"></a><span class='hs-comment'>--	(and doesn't for strings)</span>
<a name="line-5"></a><span class='hs-comment'>-- It only works for primitive types and strings; </span>
<a name="line-6"></a><span class='hs-comment'>-- others have been removed by tidy</span>
<a name="line-7"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntPrim</span>     <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkMachInt</span>  <span class='hs-varid'>i</span>
<a name="line-8"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsWordPrim</span>    <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkMachWord</span> <span class='hs-varid'>w</span>
<a name="line-9"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsCharPrim</span>    <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachChar</span>   <span class='hs-varid'>c</span>
<a name="line-10"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsStringPrim</span>  <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachStr</span>    <span class='hs-varid'>s</span>
<a name="line-11"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFloatPrim</span>   <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span>  <span class='hs-varid'>f</span>
<a name="line-12"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsDoublePrim</span>  <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachDouble</span> <span class='hs-varid'>d</span>
<a name="line-13"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachStr</span>    <span class='hs-varid'>s</span>
<a name="line-14"></a><span class='hs-definition'>hsLitKey</span> <span class='hs-varid'>l</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"hsLitKey"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="hsOverLitKey"></a><span class='hs-definition'>hsOverLitKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OutputableBndr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HsOverLit</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-17"></a><span class='hs-comment'>-- Ditto for HsOverLit; the boolean indicates to negate</span>
<a name="line-18"></a><span class='hs-definition'>hsOverLitKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>OverLit</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ol_val</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>neg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>litValKey</span> <span class='hs-varid'>l</span> <span class='hs-varid'>neg</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="litValKey"></a><span class='hs-definition'>litValKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OverLitVal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-21"></a><span class='hs-definition'>litValKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>   <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span>
<a name="line-22"></a><span class='hs-definition'>litValKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>   <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-definition'>litValKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFractional</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span> <span class='hs-varid'>r</span>
<a name="line-24"></a><span class='hs-definition'>litValKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFractional</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-conid'>True</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-definition'>litValKey</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>   <span class='hs-varid'>neg</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>not</span> <span class='hs-varid'>neg</span><span class='hs-layout'>)</span> <span class='hs-conid'>MachStr</span> <span class='hs-varid'>s</span>
</pre>\end{code}

%************************************************************************
%*									*
	Tidying lit pats
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tidyLitPat"></a><span class='hs-definition'>tidyLitPat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span>
<a name="line-2"></a><span class='hs-comment'>-- Result has only the following HsLits:</span>
<a name="line-3"></a><span class='hs-comment'>--	HsIntPrim, HsWordPrim, HsCharPrim, HsFloatPrim</span>
<a name="line-4"></a><span class='hs-comment'>--	HsDoublePrim, HsStringPrim, HsString</span>
<a name="line-5"></a><span class='hs-comment'>--  * HsInteger, HsRat, HsInt can't show up in LitPats</span>
<a name="line-6"></a><span class='hs-comment'>--  * We get rid of HsChar right here</span>
<a name="line-7"></a><span class='hs-definition'>tidyLitPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsChar</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkCharLitPat</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-definition'>tidyLitPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>lengthFS</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>1</span>	<span class='hs-comment'>-- Short string literals only</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-varid'>pat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkPrefixConPat</span> <span class='hs-varid'>consDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkCharLitPat</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>pat</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>stringTy</span><span class='hs-layout'>)</span>
<a name="line-11"></a>	          <span class='hs-layout'>(</span><span class='hs-varid'>mkNilPat</span> <span class='hs-varid'>stringTy</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>unpackFS</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-12"></a>	<span class='hs-comment'>-- The stringTy is the type of the whole pattern, not </span>
<a name="line-13"></a>	<span class='hs-comment'>-- the type to instantiate (:) or [] with!</span>
<a name="line-14"></a><span class='hs-definition'>tidyLitPat</span> <span class='hs-varid'>lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LitPat</span> <span class='hs-varid'>lit</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="tidyNPat"></a><span class='hs-comment'>----------------</span>
<a name="line-17"></a><span class='hs-definition'>tidyNPat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsOverLit</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>SyntaxExpr</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SyntaxExpr</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span>
<a name="line-18"></a><span class='hs-definition'>tidyNPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>OverLit</span> <span class='hs-varid'>val</span> <span class='hs-conid'>False</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_neg</span> <span class='hs-keyword'>_</span>
<a name="line-19"></a>	<span class='hs-comment'>-- False: Take short cuts only if the literal is not using rebindable syntax</span>
<a name="line-20"></a>	<span class='hs-comment'>-- </span>
<a name="line-21"></a>	<span class='hs-comment'>-- Once that is settled, look for cases where the type of the </span>
<a name="line-22"></a>	<span class='hs-comment'>-- entire overloaded literal matches the type of the underlying literal,</span>
<a name="line-23"></a>	<span class='hs-comment'>-- and in that case take the short cut</span>
<a name="line-24"></a>	<span class='hs-comment'>-- NB: Watch out for wierd cases like Trac #3382</span>
<a name="line-25"></a>	<span class='hs-comment'>-- 	  f :: Int -&gt; Int</span>
<a name="line-26"></a>	<span class='hs-comment'>--	  f "blah" = 4</span>
<a name="line-27"></a>	<span class='hs-comment'>--     which might be ok if we hvae 'instance IsString Int'</span>
<a name="line-28"></a>	<span class='hs-comment'>--    </span>
<a name="line-29"></a>
<a name="line-30"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isIntTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span>    <span class='hs-conid'>Just</span> <span class='hs-varid'>int_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mb_int_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_con_pat</span> <span class='hs-varid'>intDataCon</span>    <span class='hs-layout'>(</span><span class='hs-conid'>HsIntPrim</span>    <span class='hs-varid'>int_lit</span><span class='hs-layout'>)</span>
<a name="line-31"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isWordTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span>   <span class='hs-conid'>Just</span> <span class='hs-varid'>int_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mb_int_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_con_pat</span> <span class='hs-varid'>wordDataCon</span>   <span class='hs-layout'>(</span><span class='hs-conid'>HsWordPrim</span>   <span class='hs-varid'>int_lit</span><span class='hs-layout'>)</span>
<a name="line-32"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isFloatTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span>  <span class='hs-conid'>Just</span> <span class='hs-varid'>rat_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mb_rat_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_con_pat</span> <span class='hs-varid'>floatDataCon</span>  <span class='hs-layout'>(</span><span class='hs-conid'>HsFloatPrim</span>  <span class='hs-varid'>rat_lit</span><span class='hs-layout'>)</span>
<a name="line-33"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isDoubleTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>rat_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mb_rat_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_con_pat</span> <span class='hs-varid'>doubleDataCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsDoublePrim</span> <span class='hs-varid'>rat_lit</span><span class='hs-layout'>)</span>
<a name="line-34"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isStringTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>str_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mb_str_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyLitPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsString</span> <span class='hs-varid'>str_lit</span><span class='hs-layout'>)</span>
<a name="line-35"></a>  <span class='hs-keyword'>where</span>
<a name="line-36"></a>    <span class='hs-varid'>mk_con_pat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span>
<a name="line-37"></a>    <span class='hs-varid'>mk_con_pat</span> <span class='hs-varid'>con</span> <span class='hs-varid'>lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPrefixConPat</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>noLoc</span> <span class='hs-varop'>$</span> <span class='hs-conid'>LitPat</span> <span class='hs-varid'>lit</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a>    <span class='hs-varid'>mb_int_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Integer</span>
<a name="line-40"></a>    <span class='hs-varid'>mb_int_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>mb_neg</span><span class='hs-layout'>,</span> <span class='hs-varid'>val</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-41"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>i</span>
<a name="line-42"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span>  <span class='hs-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-43"></a>		   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-44"></a>	
<a name="line-45"></a>    <span class='hs-varid'>mb_rat_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Rational</span>
<a name="line-46"></a>    <span class='hs-varid'>mb_rat_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>mb_neg</span><span class='hs-layout'>,</span> <span class='hs-varid'>val</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-47"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsIntegral</span>   <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-48"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span>  <span class='hs-conid'>HsIntegral</span>   <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-49"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsFractional</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>f</span>
<a name="line-50"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsFractional</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-51"></a>		   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-52"></a>	
<a name="line-53"></a>    <span class='hs-varid'>mb_str_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FastString</span>
<a name="line-54"></a>    <span class='hs-varid'>mb_str_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>mb_neg</span><span class='hs-layout'>,</span> <span class='hs-varid'>val</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-55"></a>		   <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsIsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>s</span>
<a name="line-56"></a>		   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-definition'>tidyNPat</span> <span class='hs-varid'>over_lit</span> <span class='hs-varid'>mb_neg</span> <span class='hs-varid'>eq</span> 
<a name="line-59"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NPat</span> <span class='hs-varid'>over_lit</span> <span class='hs-varid'>mb_neg</span> <span class='hs-varid'>eq</span>
</pre>\end{code}


%************************************************************************
%*									*
		Pattern matching on LitPat
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="matchLiterals"></a><span class='hs-definition'>matchLiterals</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-2"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>			<span class='hs-comment'>-- Type of the whole case expression</span>
<a name="line-3"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>EquationInfo</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>	<span class='hs-comment'>-- All PgLits</span>
<a name="line-4"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>MatchResult</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>matchLiterals</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span><span class='hs-conop'>:</span><span class='hs-varid'>vars</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>sub_groups</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>all</span> <span class='hs-varid'>notNull</span> <span class='hs-varid'>sub_groups</span> <span class='hs-layout'>)</span>
<a name="line-8"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span>	<span class='hs-comment'>-- Deal with each group</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>alts</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>match_group</span> <span class='hs-varid'>sub_groups</span>
<a name="line-10"></a>
<a name="line-11"></a>	 	<span class='hs-comment'>-- Combine results.  For everything except String</span>
<a name="line-12"></a>		<span class='hs-comment'>-- we can use a case expression; for String we need</span>
<a name="line-13"></a>		<span class='hs-comment'>-- a chain of if-then-else</span>
<a name="line-14"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isStringTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>var</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span>
<a name="line-15"></a>	    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>eq_str</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsLookupGlobalId</span> <span class='hs-varid'>eqStringName</span>
<a name="line-16"></a>		<span class='hs-layout'>;</span> <span class='hs-varid'>mrs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrap_str_guard</span> <span class='hs-varid'>eq_str</span><span class='hs-layout'>)</span> <span class='hs-varid'>alts</span>
<a name="line-17"></a>		<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr1</span> <span class='hs-varid'>combineMatchResults</span> <span class='hs-varid'>mrs</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-18"></a>	  <span class='hs-keyword'>else</span> 
<a name="line-19"></a>	    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkCoPrimCaseMatchResult</span> <span class='hs-varid'>var</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>alts</span><span class='hs-layout'>)</span>
<a name="line-20"></a>	<span class='hs-layout'>}</span>
<a name="line-21"></a>  <span class='hs-keyword'>where</span>
<a name="line-22"></a>    <span class='hs-varid'>match_group</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>EquationInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Literal</span><span class='hs-layout'>,</span> <span class='hs-conid'>MatchResult</span><span class='hs-layout'>)</span>
<a name="line-23"></a>    <span class='hs-varid'>match_group</span> <span class='hs-varid'>eqns</span>
<a name="line-24"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-conid'>LitPat</span> <span class='hs-varid'>hs_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>eqns</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>match_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>match</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftEqns</span> <span class='hs-varid'>eqns</span><span class='hs-layout'>)</span>
<a name="line-26"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsLitKey</span> <span class='hs-varid'>hs_lit</span><span class='hs-layout'>,</span> <span class='hs-varid'>match_result</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-27"></a>
<a name="line-28"></a>    <span class='hs-varid'>wrap_str_guard</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Literal</span><span class='hs-layout'>,</span><span class='hs-conid'>MatchResult</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>MatchResult</span>
<a name="line-29"></a>	<span class='hs-comment'>-- Equality check for string literals</span>
<a name="line-30"></a>    <span class='hs-varid'>wrap_str_guard</span> <span class='hs-varid'>eq_str</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span>
<a name="line-31"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>lit</span>    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mkStringExprFS</span> <span class='hs-varid'>s</span>
<a name="line-32"></a>	     <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkApps</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span> <span class='hs-varid'>eq_str</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span> <span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-varid'>lit</span><span class='hs-keyglyph'>]</span>
<a name="line-33"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkGuardedMatchResult</span> <span class='hs-varid'>pred</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-34"></a>    <span class='hs-varid'>wrap_str_guard</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"matchLiterals/wrap_str_guard"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-definition'>matchLiterals</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"matchLiterals []"</span>
</pre>\end{code}


%************************************************************************
%*									*
		Pattern matching on NPat
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="matchNPats"></a><span class='hs-definition'>matchNPats</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>EquationInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>MatchResult</span>
<a name="line-2"></a><span class='hs-definition'>matchNPats</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span><span class='hs-conop'>:</span><span class='hs-varid'>vars</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn1</span><span class='hs-conop'>:</span><span class='hs-varid'>eqns</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- All for the same literal</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-conid'>NPat</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>mb_neg</span> <span class='hs-varid'>eq_chk</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstPat</span> <span class='hs-varid'>eqn1</span>
<a name="line-4"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>lit_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsOverLit</span> <span class='hs-varid'>lit</span>
<a name="line-5"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>neg_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_neg</span> <span class='hs-keyword'>of</span>
<a name="line-6"></a>			    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>lit_expr</span>
<a name="line-7"></a>			    <span class='hs-conid'>Just</span> <span class='hs-varid'>neg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>neg_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>neg</span>
<a name="line-8"></a>					   <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>App</span> <span class='hs-varid'>neg_expr</span> <span class='hs-varid'>lit_expr</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>eq_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>eq_chk</span>
<a name="line-10"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>pred_expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkApps</span> <span class='hs-varid'>eq_expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span> <span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-varid'>neg_lit</span><span class='hs-keyglyph'>]</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>match_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>match</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftEqns</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn1</span><span class='hs-conop'>:</span><span class='hs-varid'>eqns</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkGuardedMatchResult</span> <span class='hs-varid'>pred_expr</span> <span class='hs-varid'>match_result</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-13"></a><span class='hs-definition'>matchNPats</span> <span class='hs-varid'>vars</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>eqns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"matchOneNPat"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>vars</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqns</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		Pattern matching on n+k patterns
%*									*
%************************************************************************

For an n+k pattern, we use the various magic expressions we've been given.
We generate:
\begin{verbatim}
    if ge var lit then
	let n = sub var lit
	in  <expr-for-a-successful-match>
    else
	<try-next-pattern-or-whatever>
\end{verbatim}


\begin{code}
<pre><a name="line-1"></a><a name="matchNPlusKPats"></a><span class='hs-definition'>matchNPlusKPats</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>EquationInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DsM</span> <span class='hs-conid'>MatchResult</span>
<a name="line-2"></a><span class='hs-comment'>-- All NPlusKPats, for the *same* literal k</span>
<a name="line-3"></a><span class='hs-definition'>matchNPlusKPats</span> <span class='hs-layout'>(</span><span class='hs-varid'>var</span><span class='hs-conop'>:</span><span class='hs-varid'>vars</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn1</span><span class='hs-conop'>:</span><span class='hs-varid'>eqns</span><span class='hs-layout'>)</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-conid'>NPlusKPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>n1</span><span class='hs-layout'>)</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>ge</span> <span class='hs-varid'>minus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstPat</span> <span class='hs-varid'>eqn1</span>
<a name="line-5"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ge_expr</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>ge</span>
<a name="line-6"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>minus_expr</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsExpr</span> <span class='hs-varid'>minus</span>
<a name="line-7"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>lit_expr</span>    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsOverLit</span> <span class='hs-varid'>lit</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>pred_expr</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkApps</span> <span class='hs-varid'>ge_expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span> <span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-varid'>lit_expr</span><span class='hs-keyglyph'>]</span>
<a name="line-9"></a>	      <span class='hs-varid'>minusk_expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkApps</span> <span class='hs-varid'>minus_expr</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span> <span class='hs-varid'>var</span><span class='hs-layout'>,</span> <span class='hs-varid'>lit_expr</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a>	      <span class='hs-layout'>(</span><span class='hs-varid'>wraps</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqns'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapAndUnzip</span> <span class='hs-layout'>(</span><span class='hs-varid'>shift</span> <span class='hs-varid'>n1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn1</span><span class='hs-conop'>:</span><span class='hs-varid'>eqns</span><span class='hs-layout'>)</span>
<a name="line-11"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>match_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>match</span> <span class='hs-varid'>vars</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>eqns'</span>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span>  <span class='hs-layout'>(</span><span class='hs-varid'>mkGuardedMatchResult</span> <span class='hs-varid'>pred_expr</span> 		<span class='hs-varop'>$</span>
<a name="line-13"></a>		   <span class='hs-varid'>mkCoLetMatchResult</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonRec</span> <span class='hs-varid'>n1</span> <span class='hs-varid'>minusk_expr</span><span class='hs-layout'>)</span>	<span class='hs-varop'>$</span>
<a name="line-14"></a>		   <span class='hs-varid'>adjustMatchResult</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr1</span> <span class='hs-layout'>(</span><span class='hs-varop'>.</span><span class='hs-layout'>)</span> <span class='hs-varid'>wraps</span><span class='hs-layout'>)</span>		<span class='hs-varop'>$</span>
<a name="line-15"></a>		   <span class='hs-varid'>match_result</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-16"></a>  <span class='hs-keyword'>where</span>
<a name="line-17"></a>    <span class='hs-varid'>shift</span> <span class='hs-varid'>n1</span> <span class='hs-varid'>eqn</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnInfo</span> <span class='hs-layout'>{</span> <span class='hs-varid'>eqn_pats</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NPlusKPat</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conop'>:</span> <span class='hs-varid'>pats</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-18"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapBind</span> <span class='hs-varid'>n</span> <span class='hs-varid'>n1</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqn</span> <span class='hs-layout'>{</span> <span class='hs-varid'>eqn_pats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pats</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-19"></a>	<span class='hs-comment'>-- The wrapBind is a no-op for the first equation</span>
<a name="line-20"></a>    <span class='hs-varid'>shift</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"matchNPlusKPats/shift"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-21"></a>
<a name="line-22"></a><span class='hs-definition'>matchNPlusKPats</span> <span class='hs-varid'>vars</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>eqns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"matchNPlusKPats"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>vars</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqns</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>