Sophie

Sophie

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

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/Check.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, 1997-1998
%
% Author: Juan J. Quintela    <quintela@krilin.dc.fi.udc.es>

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS -fno-warn-incomplete-patterns #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- The above warning supression flag is a temporary kludge.</span>
<a name="line-3"></a><span class='hs-comment'>-- While working on this module you are encouraged to remove it and fix</span>
<a name="line-4"></a><span class='hs-comment'>-- any warnings in the module. See</span>
<a name="line-5"></a><span class='hs-comment'>--     <a href="http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings">http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings</a></span>
<a name="line-6"></a><span class='hs-comment'>-- for details</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Check</span> <span class='hs-layout'>(</span> <span class='hs-varid'>check</span> <span class='hs-layout'>,</span> <span class='hs-conid'>ExhaustivePat</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>		
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsSyn</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsUtils</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MatchLit</span>
<a name="line-16"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-17"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-18"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unify</span><span class='hs-layout'>(</span> <span class='hs-varid'>dataConCannotMatch</span> <span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSet</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</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'>FastString</span>
</pre>\end{code}

This module performs checks about if one list of equations are:
\begin{itemize}
\item Overlapped
\item Non exhaustive
\end{itemize}
To discover that we go through the list of equations in a tree-like fashion.

If you like theory, a similar algorithm is described in:
\begin{quotation}
	{\em Two Techniques for Compiling Lazy Pattern Matching},
	Luc Maranguet,
	INRIA Rocquencourt (RR-2385, 1994)
\end{quotation}
The algorithm is based on the first technique, but there are some differences:
\begin{itemize}
\item We don't generate code
\item We have constructors and literals (not only literals as in the 
	  article)
\item We don't use directions, we must select the columns from 
	  left-to-right
\end{itemize}
(By the way the second technique is really similar to the one used in 
 @Match.lhs@ to generate code)

This function takes the equations of a pattern and returns:
\begin{itemize}
\item The patterns that are not recognized
\item The equations that are not overlapped
\end{itemize}
It simplify the patterns and then call @check'@ (the same semantics), and it 
needs to reconstruct the patterns again ....

The problem appear with things like:
\begin{verbatim}
  f [x,y]   = ....
  f (x:xs)  = .....
\end{verbatim}
We want to put the two patterns with the same syntax, (prefix form) and 
then all the constructors are equal:
\begin{verbatim}
  f (: x (: y []))   = ....
  f (: x xs)         = .....
\end{verbatim}
(more about that in @tidy_eqns@)

We would prefer to have a @WarningPat@ of type @String@, but Strings and the 
Pretty Printer are not friends.

We use @InPat@ in @WarningPat@ instead of @OutPat@
because we need to print the 
warning messages in the same way they are introduced, i.e. if the user 
wrote:
\begin{verbatim}
	f [x,y] = ..
\end{verbatim}
He don't want a warning message written:
\begin{verbatim}
        f (: x (: y [])) ........
\end{verbatim}
Then we need to use InPats.
\begin{quotation}
     Juan Quintela 5 JUL 1998\\
	  User-friendliness and compiler writers are no friends.
\end{quotation}

\begin{code}
<pre><a name="line-1"></a><a name="WarningPat"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>WarningPat</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InPat</span> <span class='hs-conid'>Name</span>
<a name="line-2"></a><a name="ExhaustivePat"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ExhaustivePat</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>WarningPat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-3"></a><a name="EqnNo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>EqnNo</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-4"></a><a name="EqnSet"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>EqnSet</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UniqSet</span> <span class='hs-conid'>EqnNo</span>
<a name="line-5"></a>
<a name="line-6"></a>
<a name="line-7"></a><a name="check"></a><span class='hs-definition'>check</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-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>EquationInfo</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-8"></a>  <span class='hs-comment'>-- Second result is the shadowed equations</span>
<a name="line-9"></a>  <span class='hs-comment'>-- if there are view patterns, just give up - don't know what the function is</span>
<a name="line-10"></a><span class='hs-definition'>check</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>untidy_warns</span><span class='hs-layout'>,</span> <span class='hs-varid'>shadowed_eqns</span><span class='hs-layout'>)</span>
<a name="line-11"></a>      <span class='hs-keyword'>where</span>
<a name="line-12"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>warns</span><span class='hs-layout'>,</span> <span class='hs-varid'>used_nos</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check'</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>map</span> <span class='hs-varid'>tidy_eqn</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span>
<a name="line-13"></a>	<span class='hs-varid'>untidy_warns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>untidy_exhaustive</span> <span class='hs-varid'>warns</span> 
<a name="line-14"></a>	<span class='hs-varid'>shadowed_eqns</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>eqn</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span> <span class='hs-varop'>`zip`</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> 
<a name="line-15"></a>				<span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>`elementOfUniqSet`</span> <span class='hs-varid'>used_nos</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="untidy_exhaustive"></a><span class='hs-definition'>untidy_exhaustive</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExhaustivePat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExhaustivePat</span>
<a name="line-18"></a><span class='hs-definition'>untidy_exhaustive</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>pat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-varid'>messages</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-19"></a>		  <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>untidy_no_pars</span> <span class='hs-varid'>pat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span> <span class='hs-varid'>untidy_message</span> <span class='hs-varid'>messages</span><span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-definition'>untidy_exhaustive</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>messages</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-21"></a>		  <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>untidy_pars</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span> <span class='hs-varid'>untidy_message</span> <span class='hs-varid'>messages</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="untidy_message"></a><span class='hs-definition'>untidy_message</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-definition'>untidy_message</span> <span class='hs-layout'>(</span><span class='hs-varid'>string</span><span class='hs-layout'>,</span> <span class='hs-varid'>lits</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>string</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span> <span class='hs-varid'>untidy_lit</span> <span class='hs-varid'>lits</span><span class='hs-layout'>)</span>
</pre>\end{code}

The function @untidy@ does the reverse work of the @tidy_pat@ funcion.

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="NeedPars"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>NeedPars</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span> 
<a name="line-3"></a>
<a name="line-4"></a><a name="untidy_no_pars"></a><span class='hs-definition'>untidy_no_pars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarningPat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span>
<a name="line-5"></a><span class='hs-definition'>untidy_no_pars</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>untidy</span> <span class='hs-conid'>False</span> <span class='hs-varid'>p</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="untidy_pars"></a><span class='hs-definition'>untidy_pars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarningPat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span>
<a name="line-8"></a><span class='hs-definition'>untidy_pars</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>untidy</span> <span class='hs-conid'>True</span> <span class='hs-varid'>p</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="untidy"></a><span class='hs-definition'>untidy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NeedPars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span>
<a name="line-11"></a><span class='hs-definition'>untidy</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-varid'>untidy'</span> <span class='hs-varid'>b</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyword'>where</span>
<a name="line-13"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-14"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>VarPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-15"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitPat</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LitPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>untidy_lit</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>
<a name="line-16"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ConPatIn</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-17"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatIn</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pars</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatIn</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>untidy_con</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-18"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListPat</span> <span class='hs-varid'>pats</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ListPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>untidy_no_pars</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-19"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TuplePat</span> <span class='hs-varid'>pats</span> <span class='hs-varid'>box</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TuplePat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>untidy_no_pars</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> <span class='hs-varid'>box</span> <span class='hs-varid'>ty</span>
<a name="line-20"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PArrPat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"Check.untidy: Shouldn't get a parallel array here!"</span>
<a name="line-21"></a>    <span class='hs-varid'>untidy'</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigPatIn</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"Check.untidy: SigPat"</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="untidy_con"></a><span class='hs-definition'>untidy_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsConPatDetails</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsConPatDetails</span> <span class='hs-conid'>Name</span>
<a name="line-24"></a><span class='hs-definition'>untidy_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>untidy_pars</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> 
<a name="line-25"></a><span class='hs-definition'>untidy_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixCon</span> <span class='hs-varid'>p1</span> <span class='hs-varid'>p2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InfixCon</span>  <span class='hs-layout'>(</span><span class='hs-varid'>untidy_pars</span> <span class='hs-varid'>p1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>untidy_pars</span> <span class='hs-varid'>p2</span><span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-definition'>untidy_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRecFields</span> <span class='hs-varid'>flds</span> <span class='hs-varid'>dd</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-27"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RecCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRecFields</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>fld</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hsRecFieldArg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>untidy_pars</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsRecFieldArg</span> <span class='hs-varid'>fld</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-28"></a>			<span class='hs-keyglyph'>|</span> <span class='hs-varid'>fld</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>flds</span> <span class='hs-keyglyph'>]</span> <span class='hs-varid'>dd</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="pars"></a><span class='hs-definition'>pars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NeedPars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span>
<a name="line-31"></a><span class='hs-definition'>pars</span> <span class='hs-conid'>True</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ParPat</span> <span class='hs-varid'>p</span>
<a name="line-32"></a><span class='hs-definition'>pars</span> <span class='hs-keyword'>_</span>    <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>p</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="untidy_lit"></a><span class='hs-definition'>untidy_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsLit</span>
<a name="line-35"></a><span class='hs-definition'>untidy_lit</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'>HsChar</span> <span class='hs-varid'>c</span>
<a name="line-36"></a><span class='hs-definition'>untidy_lit</span> <span class='hs-varid'>lit</span> 		  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span>
</pre>\end{code}

This equation is the same that check, the only difference is that the
boring work is done, that work needs to be done only once, this is
the reason top have two functions, check is the external interface,
@check'@ is called recursively.

There are several cases:

\begin{itemize} 
\item There are no equations: Everything is OK. 
\item There are only one equation, that can fail, and all the patterns are
      variables. Then that equation is used and the same equation is 
      non-exhaustive.
\item All the patterns are variables, and the match can fail, there are 
      more equations then the results is the result of the rest of equations 
      and this equation is used also.

\item The general case, if all the patterns are variables (here the match 
      can't fail) then the result is that this equation is used and this 
      equation doesn't generate non-exhaustive cases.

\item In the general case, there can exist literals ,constructors or only 
      vars in the first column, we actuate in consequence.

\end{itemize}


\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="check'"></a><span class='hs-definition'>check'</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> 
<a name="line-3"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> 	<span class='hs-comment'>-- Pattern scheme that might not be matched at all</span>
<a name="line-4"></a>	    <span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>  		<span class='hs-comment'>-- Eqns that are used (others are overlapped)</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>check'</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-varid'>emptyUniqSet</span><span class='hs-layout'>)</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-definition'>check'</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>n</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-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqn_rhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchResult</span> <span class='hs-varid'>can_fail</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> 
<a name="line-9"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>first_eqn_all_vars</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>can_fail</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>CantFail</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-conid'>CanFail</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span>
<a name="line-10"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitUniqSet</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- One eqn, which can't fail</span>
<a name="line-11"></a>
<a name="line-12"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>first_eqn_all_vars</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>null</span> <span class='hs-varid'>rs</span>	<span class='hs-comment'>-- One eqn, but it can fail</span>
<a name="line-13"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>takeList</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-varid'>nlWildPat</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-varid'>unitUniqSet</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-14"></a>
<a name="line-15"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>first_eqn_all_vars</span>		<span class='hs-comment'>-- Several eqns, first can fail</span>
<a name="line-16"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>addOneToUniqSet</span> <span class='hs-varid'>indexs</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-17"></a>  <span class='hs-keyword'>where</span>
<a name="line-18"></a>    <span class='hs-varid'>first_eqn_all_vars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>all_vars</span> <span class='hs-varid'>ps</span>
<a name="line-19"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check'</span> <span class='hs-varid'>rs</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-definition'>check'</span> <span class='hs-varid'>qs</span>
<a name="line-22"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>some_literals</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>split_by_literals</span> <span class='hs-varid'>qs</span>
<a name="line-23"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>some_constructors</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>split_by_constructor</span> <span class='hs-varid'>qs</span>
<a name="line-24"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>only_vars</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>first_column_only_vars</span> <span class='hs-varid'>qs</span>
<a name="line-25"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Check.check': Not implemented :-("</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>first_pats</span><span class='hs-layout'>)</span>
<a name="line-26"></a>     	         <span class='hs-comment'>-- Shouldn't happen</span>
<a name="line-27"></a>  <span class='hs-keyword'>where</span>
<a name="line-28"></a>     <span class='hs-comment'>-- Note: RecPats will have been simplified to ConPats</span>
<a name="line-29"></a>     <span class='hs-comment'>--       at this stage.</span>
<a name="line-30"></a>    <span class='hs-varid'>first_pats</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>okGroup</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprGroup</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>)</span> <span class='hs-varid'>map</span> <span class='hs-varid'>firstPatN</span> <span class='hs-varid'>qs</span>
<a name="line-31"></a>    <span class='hs-varid'>some_constructors</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>is_con</span> <span class='hs-varid'>first_pats</span>
<a name="line-32"></a>    <span class='hs-varid'>some_literals</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>is_lit</span> <span class='hs-varid'>first_pats</span>
<a name="line-33"></a>    <span class='hs-varid'>only_vars</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>all</span> <span class='hs-varid'>is_var</span> <span class='hs-varid'>first_pats</span>
</pre>\end{code}

Here begins the code to deal with literals, we need to split the matrix
in different matrix beginning by each literal and a last matrix with the 
rest of values.

\begin{code}
<pre><a name="line-1"></a><a name="split_by_literals"></a><span class='hs-definition'>split_by_literals</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>split_by_literals</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>process_literals</span> <span class='hs-varid'>used_lits</span> <span class='hs-varid'>qs</span>
<a name="line-3"></a>           <span class='hs-keyword'>where</span>
<a name="line-4"></a>             <span class='hs-varid'>used_lits</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_used_lits</span> <span class='hs-varid'>qs</span>
</pre>\end{code}

@process_explicit_literals@ is a function that process each literal that appears 
in the column of the matrix. 

\begin{code}
<pre><a name="line-1"></a><a name="process_explicit_literals"></a><span class='hs-definition'>process_explicit_literals</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>process_explicit_literals</span> <span class='hs-varid'>lits</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>unionManyUniqSets</span> <span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>
<a name="line-3"></a>    <span class='hs-keyword'>where</span>                  
<a name="line-4"></a>      <span class='hs-varid'>pats_indexs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>construct_literal_matrix</span> <span class='hs-varid'>x</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span> <span class='hs-varid'>lits</span>
<a name="line-5"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varid'>pats_indexs</span> 
</pre>\end{code}


@process_literals@ calls @process_explicit_literals@ to deal with the literals 
that appears in the matrix and deal also with the rest of the cases. It 
must be one Variable to be complete.

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="process_literals"></a><span class='hs-definition'>process_literals</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-3"></a><span class='hs-definition'>process_literals</span> <span class='hs-varid'>used_lits</span> <span class='hs-varid'>qs</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>default_eqns</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-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>make_row_vars</span> <span class='hs-varid'>used_lits</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats_default</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs_default</span><span class='hs-layout'>)</span>
<a name="line-6"></a>     <span class='hs-keyword'>where</span>
<a name="line-7"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>process_explicit_literals</span> <span class='hs-varid'>used_lits</span> <span class='hs-varid'>qs</span>
<a name="line-8"></a>       <span class='hs-varid'>default_eqns</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>okGroup</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprGroup</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>)</span> 
<a name="line-9"></a>			 <span class='hs-keyglyph'>[</span><span class='hs-varid'>remove_var</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>is_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>pats'</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check'</span> <span class='hs-varid'>default_eqns</span> 
<a name="line-11"></a>       <span class='hs-varid'>pats_default</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>nlWildPat</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span><span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span><span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats'</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pats</span> 
<a name="line-12"></a>       <span class='hs-varid'>indexs_default</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionUniqSets</span> <span class='hs-varid'>indexs'</span> <span class='hs-varid'>indexs</span>
</pre>\end{code}

Here we have selected the literal and we will select all the equations that 
begins for that literal and create a new matrix.

\begin{code}
<pre><a name="line-1"></a><a name="construct_literal_matrix"></a><span class='hs-definition'>construct_literal_matrix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>construct_literal_matrix</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span>
<a name="line-3"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>new_lit</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> 
<a name="line-4"></a>  <span class='hs-keyword'>where</span>
<a name="line-5"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>check'</span> <span class='hs-layout'>(</span><span class='hs-varid'>remove_first_column_lit</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-6"></a>    <span class='hs-varid'>new_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nlLitPat</span> <span class='hs-varid'>lit</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="remove_first_column_lit"></a><span class='hs-definition'>remove_first_column_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsLit</span>
<a name="line-9"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> 
<a name="line-10"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-11"></a><span class='hs-definition'>remove_first_column_lit</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>qs</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>okGroup</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprGroup</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>)</span> 
<a name="line-13"></a>    <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>shift_pat</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>q</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>is_var_lit</span> <span class='hs-varid'>lit</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-14"></a>  <span class='hs-keyword'>where</span>
<a name="line-15"></a>     <span class='hs-varid'>shift_pat</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-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</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'>ps</span> <span class='hs-layout'>}</span>
<a name="line-16"></a>     <span class='hs-varid'>shift_pat</span> <span class='hs-keyword'>_</span>                                <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"Check.shift_var: no patterns"</span>
</pre>\end{code}

This function splits the equations @qs@ in groups that deal with the 
same constructor.

\begin{code}
<pre><a name="line-1"></a><a name="split_by_constructor"></a><span class='hs-definition'>split_by_constructor</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>split_by_constructor</span> <span class='hs-varid'>qs</span> 
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>notNull</span> <span class='hs-varid'>unused_cons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>need_default_case</span> <span class='hs-varid'>used_cons</span> <span class='hs-varid'>unused_cons</span> <span class='hs-varid'>qs</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>no_need_default_case</span> <span class='hs-varid'>used_cons</span> <span class='hs-varid'>qs</span> 
<a name="line-5"></a>                       <span class='hs-keyword'>where</span> 
<a name="line-6"></a>                          <span class='hs-varid'>used_cons</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_used_cons</span> <span class='hs-varid'>qs</span> 
<a name="line-7"></a>                          <span class='hs-varid'>unused_cons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_unused_cons</span> <span class='hs-varid'>used_cons</span> 
</pre>\end{code}

The first column of the patterns matrix only have vars, then there is 
nothing to do.

\begin{code}
<pre><a name="line-1"></a><a name="first_column_only_vars"></a><span class='hs-definition'>first_column_only_vars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>first_column_only_vars</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>nlWildPat</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>
<a name="line-3"></a>                          <span class='hs-keyword'>where</span>
<a name="line-4"></a>                            <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check'</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>remove_var</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span>
</pre>\end{code}

This equation takes a matrix of patterns and split the equations by 
constructor, using all the constructors that appears in the first column 
of the pattern matching.

We can need a default clause or not ...., it depends if we used all the 
constructors or not explicitly. The reasoning is similar to @process_literals@,
the difference is that here the default case is not always needed.

\begin{code}
<pre><a name="line-1"></a><a name="no_need_default_case"></a><span class='hs-definition'>no_need_default_case</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>no_need_default_case</span> <span class='hs-varid'>cons</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>unionManyUniqSets</span> <span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>
<a name="line-3"></a>    <span class='hs-keyword'>where</span>                  
<a name="line-4"></a>      <span class='hs-varid'>pats_indexs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>construct_matrix</span> <span class='hs-varid'>x</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span> <span class='hs-varid'>cons</span>
<a name="line-5"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varid'>pats_indexs</span> 
<a name="line-6"></a>
<a name="line-7"></a><a name="need_default_case"></a><span class='hs-definition'>need_default_case</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DataCon</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-definition'>need_default_case</span> <span class='hs-varid'>used_cons</span> <span class='hs-varid'>unused_cons</span> <span class='hs-varid'>qs</span> 
<a name="line-9"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>default_eqns</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats_default_no_eqns</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pats_default</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs_default</span><span class='hs-layout'>)</span>
<a name="line-11"></a>     <span class='hs-keyword'>where</span>
<a name="line-12"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>no_need_default_case</span> <span class='hs-varid'>used_cons</span> <span class='hs-varid'>qs</span>
<a name="line-13"></a>       <span class='hs-varid'>default_eqns</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>okGroup</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprGroup</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>)</span> 
<a name="line-14"></a>			 <span class='hs-keyglyph'>[</span><span class='hs-varid'>remove_var</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>is_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-15"></a>       <span class='hs-layout'>(</span><span class='hs-varid'>pats'</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>check'</span> <span class='hs-varid'>default_eqns</span> 
<a name="line-16"></a>       <span class='hs-varid'>pats_default</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>make_whole_con</span> <span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span><span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> 
<a name="line-17"></a>                          <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unused_cons</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span><span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>pats'</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pats</span>
<a name="line-18"></a>       <span class='hs-varid'>new_wilds</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-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span> <span class='hs-varid'>make_row_vars_for_constructor</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span>
<a name="line-19"></a>       <span class='hs-varid'>pats_default_no_eqns</span> <span class='hs-keyglyph'>=</span>  <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>make_whole_con</span> <span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>new_wilds</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unused_cons</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pats</span>
<a name="line-20"></a>       <span class='hs-varid'>indexs_default</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionUniqSets</span> <span class='hs-varid'>indexs'</span> <span class='hs-varid'>indexs</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="construct_matrix"></a><span class='hs-definition'>construct_matrix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>ExhaustivePat</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-conid'>EqnSet</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-definition'>construct_matrix</span> <span class='hs-varid'>con</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span>
<a name="line-24"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>make_con</span> <span class='hs-varid'>con</span><span class='hs-layout'>)</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> 
<a name="line-25"></a>  <span class='hs-keyword'>where</span>
<a name="line-26"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>pats</span><span class='hs-layout'>,</span><span class='hs-varid'>indexs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>check'</span> <span class='hs-layout'>(</span><span class='hs-varid'>remove_first_column</span> <span class='hs-varid'>con</span> <span class='hs-varid'>qs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
</pre>\end{code}

Here remove first column is more difficult that with literals due to the fact 
that constructors can have arguments.

For instance, the matrix
\begin{verbatim}
 (: x xs) y
 z        y
\end{verbatim}
is transformed in:
\begin{verbatim}
 x xs y
 _ _  y
\end{verbatim}

\begin{code}
<pre><a name="line-1"></a><a name="remove_first_column"></a><span class='hs-definition'>remove_first_column</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span>                <span class='hs-comment'>-- Constructor </span>
<a name="line-2"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> 
<a name="line-3"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-4"></a><span class='hs-definition'>remove_first_column</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>con</span><span class='hs-layout'>,</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>con_pats</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>qs</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT2</span><span class='hs-layout'>(</span> <span class='hs-varid'>okGroup</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprGroup</span> <span class='hs-varid'>qs</span> <span class='hs-layout'>)</span> 
<a name="line-6"></a>    <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>shift_var</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>q</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-varid'>is_var_con</span> <span class='hs-varid'>con</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a>  <span class='hs-keyword'>where</span>
<a name="line-8"></a>     <span class='hs-varid'>new_wilds</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>WildPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsLPatType</span> <span class='hs-varid'>arg_pat</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>arg_pat</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>con_pats</span><span class='hs-keyglyph'>]</span>
<a name="line-9"></a>     <span class='hs-varid'>shift_var</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'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>ps'</span> <span class='hs-layout'>}</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-10"></a> 	<span class='hs-keyglyph'>=</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'>map</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>ps'</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span>
<a name="line-11"></a>     <span class='hs-varid'>shift_var</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'>WildPat</span> <span class='hs-keyword'>_</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  	<span class='hs-keyglyph'>=</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'>new_wilds</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span>
<a name="line-13"></a>     <span class='hs-varid'>shift_var</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"Check.Shift_var:No done"</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="make_row_vars"></a><span class='hs-definition'>make_row_vars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExhaustivePat</span>
<a name="line-16"></a><span class='hs-definition'>make_row_vars</span> <span class='hs-varid'>used_lits</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</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-varid'>pats</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-17"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>nlVarPat</span> <span class='hs-varid'>new_var</span><span class='hs-conop'>:</span><span class='hs-varid'>takeList</span> <span class='hs-layout'>(</span><span class='hs-varid'>tail</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-varid'>nlWildPat</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>new_var</span><span class='hs-layout'>,</span><span class='hs-varid'>used_lits</span><span class='hs-layout'>)</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-varid'>new_var</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hash_x</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="hash_x"></a><span class='hs-definition'>hash_x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span>
<a name="line-22"></a><span class='hs-definition'>hash_x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>unboundKey</span> <span class='hs-comment'>{- doesn't matter much -}</span>
<a name="line-23"></a>		     <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOccFS</span> <span class='hs-layout'>(</span><span class='hs-varid'>fsLit</span> <span class='hs-str'>"#x"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-24"></a>		     <span class='hs-varid'>noSrcSpan</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="make_row_vars_for_constructor"></a><span class='hs-definition'>make_row_vars_for_constructor</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>WarningPat</span><span class='hs-keyglyph'>]</span>
<a name="line-27"></a><span class='hs-definition'>make_row_vars_for_constructor</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</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-varid'>pats</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-28"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>takeList</span> <span class='hs-layout'>(</span><span class='hs-varid'>tail</span> <span class='hs-varid'>pats</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-varid'>nlWildPat</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="compare_cons"></a><span class='hs-definition'>compare_cons</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</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> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-31"></a><span class='hs-definition'>compare_cons</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id1</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id2</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>id2</span>  
<a name="line-32"></a>
<a name="line-33"></a><a name="remove_dups"></a><span class='hs-definition'>remove_dups</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-34"></a><span class='hs-definition'>remove_dups</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-35"></a><span class='hs-definition'>remove_dups</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>or</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>compare_cons</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>remove_dups</span>  <span class='hs-varid'>xs</span>
<a name="line-36"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>remove_dups</span> <span class='hs-varid'>xs</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="get_used_cons"></a><span class='hs-definition'>get_used_cons</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-39"></a><span class='hs-definition'>get_used_cons</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>remove_dups</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pat</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qs</span><span class='hs-layout'>,</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>pat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>,</span> 
<a name="line-40"></a>				      <span class='hs-varid'>isConPatOut</span> <span class='hs-varid'>pat</span><span class='hs-keyglyph'>]</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="isConPatOut"></a><span class='hs-definition'>isConPatOut</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-43"></a><span class='hs-definition'>isConPatOut</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-44"></a><span class='hs-definition'>isConPatOut</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="remove_dups'"></a><span class='hs-definition'>remove_dups'</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span> 
<a name="line-47"></a><span class='hs-definition'>remove_dups'</span> <span class='hs-conid'>[]</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-48"></a><span class='hs-definition'>remove_dups'</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>remove_dups'</span> <span class='hs-varid'>xs</span>
<a name="line-49"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>remove_dups'</span> <span class='hs-varid'>xs</span> 
<a name="line-50"></a>
<a name="line-51"></a>
<a name="line-52"></a><a name="get_used_lits"></a><span class='hs-definition'>get_used_lits</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span>
<a name="line-53"></a><span class='hs-definition'>get_used_lits</span> <span class='hs-varid'>qs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>remove_dups'</span> <span class='hs-varid'>all_literals</span>
<a name="line-54"></a>	         <span class='hs-keyword'>where</span>
<a name="line-55"></a>	           <span class='hs-varid'>all_literals</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_used_lits'</span> <span class='hs-varid'>qs</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="get_used_lits'"></a><span class='hs-definition'>get_used_lits'</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>HsLit</span><span class='hs-keyglyph'>]</span>
<a name="line-58"></a><span class='hs-definition'>get_used_lits'</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-59"></a><span class='hs-definition'>get_used_lits'</span> <span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-conop'>:</span><span class='hs-varid'>qs</span><span class='hs-layout'>)</span> 
<a name="line-60"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get_lit</span> <span class='hs-layout'>(</span><span class='hs-varid'>firstPatN</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span> <span class='hs-conop'>:</span> <span class='hs-varid'>get_used_lits'</span> <span class='hs-varid'>qs</span>
<a name="line-61"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>		              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_used_lits</span> <span class='hs-varid'>qs</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="get_lit"></a><span class='hs-definition'>get_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>HsLit</span> 
<a name="line-64"></a><span class='hs-comment'>-- Get a representative HsLit to stand for the OverLit</span>
<a name="line-65"></a><span class='hs-comment'>-- It doesn't matter which one, because they will only be compared</span>
<a name="line-66"></a><span class='hs-comment'>-- with other HsLits gotten in the same way</span>
<a name="line-67"></a><span class='hs-definition'>get_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitPat</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>				          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>lit</span>
<a name="line-68"></a><span class='hs-definition'>get_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPat</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-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>    <span class='hs-varid'>mb</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntPrim</span>   <span class='hs-layout'>(</span><span class='hs-varid'>mb_neg</span> <span class='hs-varid'>mb</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-69"></a><span class='hs-definition'>get_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPat</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-conid'>HsFractional</span> <span class='hs-varid'>f</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFloatPrim</span> <span class='hs-layout'>(</span><span class='hs-varid'>mb_neg</span> <span class='hs-varid'>mb</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-70"></a><span class='hs-definition'>get_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPat</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-conid'>HsIsString</span> <span class='hs-varid'>s</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>   <span class='hs-keyword'>_</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsStringPrim</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-71"></a><span class='hs-definition'>get_lit</span> <span class='hs-keyword'>_</span>                                	          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="mb_neg"></a><span class='hs-definition'>mb_neg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-74"></a><span class='hs-definition'>mb_neg</span> <span class='hs-conid'>Nothing</span>  <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span>
<a name="line-75"></a><span class='hs-definition'>mb_neg</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-varid'>v</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="get_unused_cons"></a><span class='hs-definition'>get_unused_cons</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DataCon</span><span class='hs-keyglyph'>]</span>
<a name="line-78"></a><span class='hs-definition'>get_unused_cons</span> <span class='hs-varid'>used_cons</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-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>used_cons</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span> <span class='hs-varid'>unused_cons</span>
<a name="line-79"></a>     <span class='hs-keyword'>where</span>
<a name="line-80"></a>       <span class='hs-varid'>used_set</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UniqSet</span> <span class='hs-conid'>DataCon</span>
<a name="line-81"></a>       <span class='hs-varid'>used_set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUniqSet</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>d</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>used_cons</span><span class='hs-keyglyph'>]</span>
<a name="line-82"></a>       <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pat_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>head</span> <span class='hs-varid'>used_cons</span>
<a name="line-83"></a>       <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty_con</span><span class='hs-layout'>,</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitTyConApp_maybe</span> <span class='hs-varid'>ty</span>
<a name="line-84"></a>       <span class='hs-varid'>unused_cons</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterOut</span> <span class='hs-varid'>is_used</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>ty_con</span><span class='hs-layout'>)</span>
<a name="line-85"></a>       <span class='hs-varid'>is_used</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>con</span> <span class='hs-varop'>`elementOfUniqSet`</span> <span class='hs-varid'>used_set</span>
<a name="line-86"></a>		     <span class='hs-varop'>||</span> <span class='hs-varid'>dataConCannotMatch</span> <span class='hs-varid'>inst_tys</span> <span class='hs-varid'>con</span>
<a name="line-87"></a>
<a name="line-88"></a><a name="all_vars"></a><span class='hs-definition'>all_vars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-89"></a><span class='hs-definition'>all_vars</span> <span class='hs-conid'>[]</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-90"></a><span class='hs-definition'>all_vars</span> <span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>all_vars</span> <span class='hs-varid'>ps</span>
<a name="line-91"></a><span class='hs-definition'>all_vars</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-92"></a>
<a name="line-93"></a><a name="remove_var"></a><span class='hs-definition'>remove_var</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span>
<a name="line-94"></a><span class='hs-definition'>remove_var</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</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'>WildPat</span> <span class='hs-keyword'>_</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</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'>ps</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-95"></a><span class='hs-definition'>remove_var</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"Check.remove_var: equation does not begin with a variable"</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="eqnPats"></a><span class='hs-comment'>-----------------------</span>
<a name="line-98"></a><span class='hs-definition'>eqnPats</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-99"></a><span class='hs-definition'>eqnPats</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eqn_pats</span> <span class='hs-varid'>eqn</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="okGroup"></a><span class='hs-definition'>okGroup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-102"></a><span class='hs-comment'>-- True if all equations have at least one pattern, and</span>
<a name="line-103"></a><span class='hs-comment'>-- all have the same number of patterns</span>
<a name="line-104"></a><span class='hs-definition'>okGroup</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-105"></a><span class='hs-definition'>okGroup</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-conop'>:</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_pats</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>and</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>length</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqnPats</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n_pats</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>es</span><span class='hs-keyglyph'>]</span>
<a name="line-106"></a>	       <span class='hs-keyword'>where</span>
<a name="line-107"></a>		 <span class='hs-varid'>n_pats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqnPats</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="pprGroup"></a><span class='hs-comment'>-- Half-baked print</span>
<a name="line-110"></a><span class='hs-definition'>pprGroup</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-111"></a><a name="pprEqnInfo"></a><span class='hs-definition'>pprEqnInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-112"></a><span class='hs-definition'>pprGroup</span> <span class='hs-varid'>es</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>pprEqnInfo</span> <span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-113"></a><span class='hs-definition'>pprEqnInfo</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqnPats</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-114"></a>
<a name="line-115"></a>
<a name="line-116"></a><a name="firstPatN"></a><span class='hs-definition'>firstPatN</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqnNo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EquationInfo</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span>
<a name="line-117"></a><span class='hs-definition'>firstPatN</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>firstPat</span> <span class='hs-varid'>eqn</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="is_con"></a><span class='hs-definition'>is_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-120"></a><span class='hs-definition'>is_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-121"></a><span class='hs-definition'>is_con</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="is_lit"></a><span class='hs-definition'>is_lit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-124"></a><span class='hs-definition'>is_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-125"></a><span class='hs-definition'>is_lit</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-126"></a><span class='hs-definition'>is_lit</span> <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="is_var"></a><span class='hs-definition'>is_var</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-129"></a><span class='hs-definition'>is_var</span> <span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-130"></a><span class='hs-definition'>is_var</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-131"></a>
<a name="line-132"></a><a name="is_var_con"></a><span class='hs-definition'>is_var_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-133"></a><span class='hs-definition'>is_var_con</span> <span class='hs-keyword'>_</span>   <span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                                 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-134"></a><span class='hs-definition'>is_var_con</span> <span class='hs-varid'>con</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>id</span> <span class='hs-varop'>==</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-135"></a><span class='hs-definition'>is_var_con</span> <span class='hs-keyword'>_</span>   <span class='hs-keyword'>_</span>                                           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-136"></a>
<a name="line-137"></a><a name="is_var_lit"></a><span class='hs-definition'>is_var_lit</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> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-138"></a><span class='hs-definition'>is_var_lit</span> <span class='hs-keyword'>_</span>   <span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-139"></a><span class='hs-definition'>is_var_lit</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>pat</span> 
<a name="line-140"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>lit'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get_lit</span> <span class='hs-varid'>pat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span> <span class='hs-varop'>==</span> <span class='hs-varid'>lit'</span>
<a name="line-141"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>		     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

The difference beteewn @make_con@ and @make_whole_con@ is that
@make_wole_con@ creates a new constructor with all their arguments, and
@make_con@ takes a list of argumntes, creates the contructor getting their
arguments from the list. See where \fbox{\ ???\ } are used for details.

We need to reconstruct the patterns (make the constructors infix and
similar) at the same time that we create the constructors.

You can tell tuple constructors using
\begin{verbatim}
        Id.isTupleCon
\end{verbatim}
You can see if one constructor is infix with this clearer code :-))))))))))
\begin{verbatim}
        Lex.isLexConSym (Name.occNameString (Name.getOccName con))
\end{verbatim}

       Rather clumsy but it works. (Simon Peyton Jones)


We don't mind the @nilDataCon@ because it doesn't change the way to
print the messsage, we are searching only for things like: @[1,2,3]@,
not @x:xs@ ....

In @reconstruct_pat@ we want to ``undo'' the work
that we have done in @tidy_pat@.
In particular:
\begin{tabular}{lll}
	@((,) x y)@   & returns to be & @(x, y)@
\\      @((:) x xs)@  & returns to be & @(x:xs)@
\\      @(x:(...:[])@ & returns to be & @[x,...]@
\end{tabular}
%
The difficult case is the third one becouse we need to follow all the
contructors until the @[]@ to know that we need to use the second case,
not the second. \fbox{\ ???\ }
%
\begin{code}
<pre><a name="line-1"></a><a name="isInfixCon"></a><span class='hs-definition'>isInfixCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-2"></a><span class='hs-definition'>isInfixCon</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDataSymOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>getOccName</span> <span class='hs-varid'>con</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="is_nil"></a><span class='hs-definition'>is_nil</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-5"></a><span class='hs-definition'>is_nil</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatIn</span> <span class='hs-varid'>con</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>con</span> <span class='hs-varop'>==</span> <span class='hs-varid'>getName</span> <span class='hs-varid'>nilDataCon</span>
<a name="line-6"></a><span class='hs-definition'>is_nil</span> <span class='hs-keyword'>_</span>               		     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="is_list"></a><span class='hs-definition'>is_list</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-9"></a><span class='hs-definition'>is_list</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListPat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-10"></a><span class='hs-definition'>is_list</span> <span class='hs-keyword'>_</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="return_list"></a><span class='hs-definition'>return_list</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-13"></a><span class='hs-definition'>return_list</span> <span class='hs-varid'>id</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <span class='hs-varop'>==</span> <span class='hs-varid'>consDataCon</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>is_nil</span> <span class='hs-varid'>q</span> <span class='hs-varop'>||</span> <span class='hs-varid'>is_list</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> 
<a name="line-14"></a>
<a name="line-15"></a><a name="make_list"></a><span class='hs-definition'>make_list</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LPat</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Name</span>
<a name="line-16"></a><span class='hs-definition'>make_list</span> <span class='hs-varid'>p</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_nil</span> <span class='hs-varid'>q</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ListPat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>p</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>placeHolderType</span>
<a name="line-17"></a><span class='hs-definition'>make_list</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListPat</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ListPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-18"></a><span class='hs-definition'>make_list</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'>"Check.make_list: Invalid argument"</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="make_con"></a><span class='hs-definition'>make_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExhaustivePat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExhaustivePat</span>           
<a name="line-21"></a><span class='hs-definition'>make_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>lp</span><span class='hs-conop'>:</span><span class='hs-varid'>lq</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> 
<a name="line-22"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>return_list</span> <span class='hs-varid'>id</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-layout'>(</span><span class='hs-varid'>make_list</span> <span class='hs-varid'>lp</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span>
<a name="line-23"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isInfixCon</span> <span class='hs-varid'>id</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>nlInfixConPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>getName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varid'>lp</span> <span class='hs-varid'>lq</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> 
<a name="line-24"></a>   <span class='hs-keyword'>where</span> <span class='hs-varid'>q</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>lq</span>	
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-definition'>make_con</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span><span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>pat_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ps</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> 
<a name="line-27"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isTupleTyCon</span> <span class='hs-varid'>tc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>TuplePat</span> <span class='hs-varid'>pats_con</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleTyConBoxity</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>rest_pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> 
<a name="line-28"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isPArrFakeCon</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>PArrPat</span> <span class='hs-varid'>pats_con</span> <span class='hs-varid'>placeHolderType</span><span class='hs-layout'>)</span>           <span class='hs-conop'>:</span> <span class='hs-varid'>rest_pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span> 
<a name="line-29"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>        <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>nlConPat</span> <span class='hs-varid'>name</span> <span class='hs-varid'>pats_con</span>      <span class='hs-conop'>:</span> <span class='hs-varid'>rest_pats</span><span class='hs-layout'>,</span> <span class='hs-varid'>constraints</span><span class='hs-layout'>)</span>
<a name="line-30"></a>    <span class='hs-keyword'>where</span> 
<a name="line-31"></a>	<span class='hs-varid'>name</span>     	      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getName</span> <span class='hs-varid'>id</span>
<a name="line-32"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>pats_con</span><span class='hs-layout'>,</span> <span class='hs-varid'>rest_pats</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAtList</span> <span class='hs-varid'>pats</span> <span class='hs-varid'>ps</span>
<a name="line-33"></a>	<span class='hs-varid'>tc</span>	    	      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConTyCon</span> <span class='hs-varid'>id</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='hs-comment'>-- reconstruct parallel array pattern</span>
<a name="line-36"></a><span class='hs-comment'>--</span>
<a name="line-37"></a><span class='hs-comment'>--  * don't check for the type only; we need to make sure that we are really</span>
<a name="line-38"></a><span class='hs-comment'>--   dealing with one of the fake constructors and not with the real</span>
<a name="line-39"></a><span class='hs-comment'>--   representation </span>
<a name="line-40"></a>
<a name="line-41"></a><a name="make_whole_con"></a><span class='hs-definition'>make_whole_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarningPat</span>
<a name="line-42"></a><span class='hs-definition'>make_whole_con</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isInfixCon</span> <span class='hs-varid'>con</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nlInfixConPat</span> <span class='hs-varid'>name</span> <span class='hs-varid'>nlWildPat</span> <span class='hs-varid'>nlWildPat</span>
<a name="line-43"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nlConPat</span> <span class='hs-varid'>name</span> <span class='hs-varid'>pats</span>
<a name="line-44"></a>                <span class='hs-keyword'>where</span> 
<a name="line-45"></a>                  <span class='hs-varid'>name</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getName</span> <span class='hs-varid'>con</span>
<a name="line-46"></a>                  <span class='hs-varid'>pats</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>nlWildPat</span> <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dataConOrigArgTys</span> <span class='hs-varid'>con</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

------------------------------------------------------------------------
                   Tidying equations
------------------------------------------------------------------------

tidy_eqn does more or less the same thing as @tidy@ in @Match.lhs@;
that is, it removes syntactic sugar, reducing the number of cases that
must be handled by the main checking algorithm.  One difference is
that here we can do *all* the tidying at once (recursively), rather 
than doing it incrementally.

\begin{code}
<pre><a name="line-1"></a><a name="tidy_eqn"></a><span class='hs-definition'>tidy_eqn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EquationInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EquationInfo</span>
<a name="line-2"></a><span class='hs-definition'>tidy_eqn</span> <span class='hs-varid'>eqn</span> <span class='hs-keyglyph'>=</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'>map</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn_pats</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>		     <span class='hs-varid'>eqn_rhs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_rhs</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn_rhs</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-4"></a>  <span class='hs-keyword'>where</span>
<a name="line-5"></a>	<span class='hs-comment'>-- Horrible hack.  The tidy_pat stuff converts "might-fail" patterns to </span>
<a name="line-6"></a>        <span class='hs-comment'>-- WildPats which of course loses the info that they can fail to match. </span>
<a name="line-7"></a>	<span class='hs-comment'>-- So we stick in a CanFail as if it were a guard.</span>
<a name="line-8"></a>    <span class='hs-varid'>tidy_rhs</span> <span class='hs-layout'>(</span><span class='hs-conid'>MatchResult</span> <span class='hs-varid'>can_fail</span> <span class='hs-varid'>body</span><span class='hs-layout'>)</span>
<a name="line-9"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>any</span> <span class='hs-varid'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqn_pats</span> <span class='hs-varid'>eqn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchResult</span> <span class='hs-conid'>CanFail</span> <span class='hs-varid'>body</span>
<a name="line-10"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>			    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MatchResult</span> <span class='hs-varid'>can_fail</span> <span class='hs-varid'>body</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="might_fail_pat"></a><span class='hs-comment'>--------------</span>
<a name="line-13"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a><span class='hs-comment'>-- Returns True of patterns that might fail (i.e. fall through) in a way </span>
<a name="line-15"></a><span class='hs-comment'>-- that is not covered by the checking algorithm.  Specifically:</span>
<a name="line-16"></a><span class='hs-comment'>-- 	   NPlusKPat </span>
<a name="line-17"></a><span class='hs-comment'>--	   ViewPat (if refutable)</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-comment'>-- First the two special cases</span>
<a name="line-20"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPlusKPat</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 	     	     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-21"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ViewPat</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	     	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isIrrefutableHsPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-comment'>-- Now the recursive stuff</span>
<a name="line-24"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>  	   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>p</span>
<a name="line-25"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>AsPat</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> 	   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>p</span>
<a name="line-26"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigPatOut</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>)</span>    	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>p</span>
<a name="line-27"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListPat</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  	   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>ps</span>
<a name="line-28"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>TuplePat</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>ps</span>
<a name="line-29"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>PArrPat</span> <span class='hs-varid'>ps</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  	   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>ps</span>
<a name="line-30"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>BangPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>     	   	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-varid'>p</span>
<a name="line-31"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>any</span> <span class='hs-varid'>might_fail_lpat</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsConPatArgs</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><span class='hs-comment'>-- Finally the ones that are sure to succeed, or which are covered by the checking algorithm</span>
<a name="line-34"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>LazyPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>                   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <span class='hs-comment'>-- Always succeeds</span>
<a name="line-35"></a><span class='hs-definition'>might_fail_pat</span> <span class='hs-keyword'>_</span>                             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <span class='hs-comment'>-- VarPat, VarPatOut, WildPat, LitPat, NPat, TypePat</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="might_fail_lpat"></a><span class='hs-comment'>--------------</span>
<a name="line-38"></a><span class='hs-definition'>might_fail_lpat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LPat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-39"></a><span class='hs-definition'>might_fail_lpat</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>might_fail_pat</span> <span class='hs-varid'>p</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="tidy_lpat"></a><span class='hs-comment'>--------------</span>
<a name="line-42"></a><span class='hs-definition'>tidy_lpat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LPat</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LPat</span> <span class='hs-conid'>Id</span>  
<a name="line-43"></a><span class='hs-definition'>tidy_lpat</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-varid'>p</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="tidy_pat"></a><span class='hs-comment'>--------------</span>
<a name="line-46"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pat</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-47"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-varid'>pat</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>WildPat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pat</span>
<a name="line-48"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarPat</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WildPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> 
<a name="line-49"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarPatOut</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WildPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> 	<span class='hs-comment'>-- Ignore the bindings</span>
<a name="line-50"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ParPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>LazyPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WildPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsLPatType</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- For overlap and exhaustiveness checking</span>
<a name="line-52"></a>							<span class='hs-comment'>-- purposes, a ~pat is like a wildcard</span>
<a name="line-53"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>BangPat</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-54"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>AsPat</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigPatOut</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-56"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoPat</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>pat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_pat</span> <span class='hs-varid'>pat</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-comment'>-- These two are might_fail patterns, so we map them to</span>
<a name="line-59"></a><span class='hs-comment'>-- WildPats.  The might_fail_pat stuff arranges that the</span>
<a name="line-60"></a><span class='hs-comment'>-- guard says "this equation might fall through".</span>
<a name="line-61"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>NPlusKPat</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WildPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-62"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ViewPat</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WildPat</span> <span class='hs-varid'>ty</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</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</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyNPat</span> <span class='hs-varid'>lit</span> <span class='hs-varid'>mb_neg</span> <span class='hs-varid'>eq</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-varid'>pat</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ConPatOut</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pat_con</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-67"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pat</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pat_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidy_con</span> <span class='hs-varid'>id</span> <span class='hs-varid'>ps</span> <span class='hs-layout'>}</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListPat</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> 
<a name="line-70"></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'>x</span> <span class='hs-varid'>y</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'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>list_ty</span><span class='hs-layout'>)</span>
<a name="line-71"></a>	                          <span class='hs-layout'>(</span><span class='hs-varid'>mkNilPat</span> <span class='hs-varid'>list_ty</span><span class='hs-layout'>)</span>
<a name="line-72"></a>	                          <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-73"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>list_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkListTy</span> <span class='hs-varid'>ty</span>
<a name="line-74"></a>
<a name="line-75"></a><span class='hs-comment'>-- introduce fake parallel array constructors to be able to handle parallel</span>
<a name="line-76"></a><span class='hs-comment'>-- arrays with the existing machinery for constructor pattern</span>
<a name="line-77"></a><span class='hs-comment'>--</span>
<a name="line-78"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>PArrPat</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-79"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkPrefixConPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>parrFakeCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-80"></a>			   <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> 
<a name="line-81"></a>			   <span class='hs-layout'>(</span><span class='hs-varid'>mkPArrTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>TuplePat</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>boxity</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-84"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unLoc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkPrefixConPat</span> <span class='hs-layout'>(</span><span class='hs-varid'>tupleCon</span> <span class='hs-varid'>boxity</span> <span class='hs-varid'>arity</span><span class='hs-layout'>)</span>
<a name="line-85"></a>		           <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-86"></a>  <span class='hs-keyword'>where</span>
<a name="line-87"></a>    <span class='hs-varid'>arity</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ps</span>
<a name="line-88"></a>
<a name="line-89"></a><span class='hs-comment'>-- Unpack string patterns fully, so we can see when they overlap with</span>
<a name="line-90"></a><span class='hs-comment'>-- each other, or even explicit lists of Chars.</span>
<a name="line-91"></a><span class='hs-definition'>tidy_pat</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitPat</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>
<a name="line-92"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HsString</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lit</span>
<a name="line-93"></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'>mk_char_lit</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-94"></a>		  <span class='hs-layout'>(</span><span class='hs-varid'>mkPrefixConPat</span> <span class='hs-varid'>nilDataCon</span> <span class='hs-conid'>[]</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-95"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-96"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyLitPat</span> <span class='hs-varid'>lit</span> 
<a name="line-97"></a>  <span class='hs-keyword'>where</span>
<a name="line-98"></a>    <span class='hs-varid'>mk_char_lit</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPrefixConPat</span> <span class='hs-varid'>charDataCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>nlLitPat</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'>charTy</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="tidy_con"></a><span class='hs-comment'>-----------------</span>
<a name="line-101"></a><span class='hs-definition'>tidy_con</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsConPatDetails</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsConPatDetails</span> <span class='hs-conid'>Id</span>
<a name="line-102"></a><span class='hs-definition'>tidy_con</span> <span class='hs-keyword'>_</span>   <span class='hs-layout'>(</span><span class='hs-conid'>PrefixCon</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-103"></a><span class='hs-definition'>tidy_con</span> <span class='hs-keyword'>_</span>   <span class='hs-layout'>(</span><span class='hs-conid'>InfixCon</span> <span class='hs-varid'>p1</span> <span class='hs-varid'>p2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>p1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidy_lpat</span> <span class='hs-varid'>p2</span><span class='hs-keyglyph'>]</span>
<a name="line-104"></a><span class='hs-definition'>tidy_con</span> <span class='hs-varid'>con</span> <span class='hs-layout'>(</span><span class='hs-conid'>RecCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRecFields</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>      
<a name="line-105"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>fs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>nlWildPat</span> <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dataConOrigArgTys</span> <span class='hs-varid'>con</span><span class='hs-keyglyph'>]</span>
<a name="line-106"></a>		<span class='hs-comment'>-- Special case for null patterns; maybe not a record at all</span>
<a name="line-107"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PrefixCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidy_lpat</span><span class='hs-varop'>.</span><span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varid'>all_pats</span><span class='hs-layout'>)</span>
<a name="line-108"></a>  <span class='hs-keyword'>where</span>
<a name="line-109"></a>     <span class='hs-comment'>-- pad out all the missing fields with WildPats.</span>
<a name="line-110"></a>    <span class='hs-varid'>field_pats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span> <span class='hs-varid'>nlWildPat</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConFieldLabels</span> <span class='hs-varid'>con</span><span class='hs-layout'>)</span>
<a name="line-111"></a>    <span class='hs-varid'>all_pats</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>HsRecField</span> <span class='hs-varid'>id</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>acc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>insertNm</span> <span class='hs-layout'>(</span><span class='hs-varid'>getName</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
<a name="line-112"></a>		     <span class='hs-varid'>field_pats</span> <span class='hs-varid'>fs</span>
<a name="line-113"></a>       
<a name="line-114"></a>    <span class='hs-varid'>insertNm</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>p</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>nm</span><span class='hs-layout'>,</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-115"></a>    <span class='hs-varid'>insertNm</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-116"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nm</span> <span class='hs-varop'>==</span> <span class='hs-varid'>n</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>nm</span><span class='hs-layout'>,</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span>
<a name="line-117"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>insertNm</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>p</span> <span class='hs-varid'>xs</span>
</pre>\end{code}
</body>
</html>