Sophie

Sophie

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

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>typecheck/Inst.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

The @Inst@ type: dictionaries or method instances

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Inst</span> <span class='hs-layout'>(</span> 
<a name="line-2"></a>	<span class='hs-conid'>Inst</span><span class='hs-layout'>,</span>
<a name="line-3"></a>
<a name="line-4"></a>	<span class='hs-varid'>pprInstances</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprDictsTheta</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprDictsInFull</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- User error messages</span>
<a name="line-5"></a>	<span class='hs-varid'>showLIE</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprInstInFull</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- Debugging messages</span>
<a name="line-6"></a>
<a name="line-7"></a>	<span class='hs-varid'>tidyInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidyMoreInsts</span><span class='hs-layout'>,</span>
<a name="line-8"></a>
<a name="line-9"></a>	<span class='hs-varid'>newDictBndr</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDictBndrs</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDictBndrsO</span><span class='hs-layout'>,</span>
<a name="line-10"></a>	<span class='hs-varid'>newDictOccs</span><span class='hs-layout'>,</span> <span class='hs-varid'>newDictOcc</span><span class='hs-layout'>,</span>
<a name="line-11"></a>	<span class='hs-varid'>instCall</span><span class='hs-layout'>,</span> <span class='hs-varid'>instStupidTheta</span><span class='hs-layout'>,</span>
<a name="line-12"></a>	<span class='hs-varid'>cloneDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkOverLit</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	<span class='hs-varid'>newIPDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>newMethod</span><span class='hs-layout'>,</span> <span class='hs-varid'>newMethodFromName</span><span class='hs-layout'>,</span> <span class='hs-varid'>newMethodWithGivenTy</span><span class='hs-layout'>,</span> 
<a name="line-14"></a>	<span class='hs-varid'>tcInstClassOp</span><span class='hs-layout'>,</span> 
<a name="line-15"></a>	<span class='hs-varid'>tcSyntaxName</span><span class='hs-layout'>,</span> 
<a name="line-16"></a>
<a name="line-17"></a>	<span class='hs-varid'>tyVarsOfInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>tyVarsOfInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>tyVarsOfLIE</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcTyVarsOfInst</span><span class='hs-layout'>,</span>
<a name="line-18"></a>	<span class='hs-varid'>tcTyVarsOfInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>ipNamesOfInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>ipNamesOfInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>fdPredsOfInst</span><span class='hs-layout'>,</span>
<a name="line-19"></a>	<span class='hs-varid'>fdPredsOfInsts</span><span class='hs-layout'>,</span> <span class='hs-varid'>growInstsTyVars</span><span class='hs-layout'>,</span> <span class='hs-varid'>getDictClassTys</span><span class='hs-layout'>,</span> <span class='hs-varid'>dictPred</span><span class='hs-layout'>,</span>
<a name="line-20"></a>
<a name="line-21"></a>	<span class='hs-varid'>lookupSimpleInst</span><span class='hs-layout'>,</span> <span class='hs-conid'>LookupInstResult</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-22"></a>	<span class='hs-varid'>tcExtendLocalInstEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcGetInstEnvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>getOverlapFlag</span><span class='hs-layout'>,</span>
<a name="line-23"></a>
<a name="line-24"></a>	<span class='hs-varid'>isAbstractableInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>isEqInst</span><span class='hs-layout'>,</span>
<a name="line-25"></a>	<span class='hs-varid'>isDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>isClassDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMethod</span><span class='hs-layout'>,</span> <span class='hs-varid'>isImplicInst</span><span class='hs-layout'>,</span>
<a name="line-26"></a>	<span class='hs-varid'>isIPDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>isInheritableInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMethodOrLit</span><span class='hs-layout'>,</span>
<a name="line-27"></a>	<span class='hs-varid'>isTyVarDict</span><span class='hs-layout'>,</span> <span class='hs-varid'>isMethodFor</span><span class='hs-layout'>,</span> 
<a name="line-28"></a>
<a name="line-29"></a>	<span class='hs-varid'>zonkInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>zonkInsts</span><span class='hs-layout'>,</span>
<a name="line-30"></a>	<span class='hs-varid'>instToId</span><span class='hs-layout'>,</span> <span class='hs-varid'>instToVar</span><span class='hs-layout'>,</span> <span class='hs-varid'>instType</span><span class='hs-layout'>,</span> <span class='hs-varid'>instName</span><span class='hs-layout'>,</span> <span class='hs-varid'>instToDictBind</span><span class='hs-layout'>,</span>
<a name="line-31"></a>	<span class='hs-varid'>addInstToDictBind</span><span class='hs-layout'>,</span>
<a name="line-32"></a>
<a name="line-33"></a>	<span class='hs-conid'>InstOrigin</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>InstLoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprInstLoc</span><span class='hs-layout'>,</span>
<a name="line-34"></a>
<a name="line-35"></a>	<span class='hs-varid'>mkWantedCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkGivenCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>isWantedCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqInstCoType</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIdEqInstCo</span><span class='hs-layout'>,</span> 
<a name="line-36"></a>        <span class='hs-varid'>mkSymEqInstCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkLeftTransEqInstCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkRightTransEqInstCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkAppEqInstCo</span><span class='hs-layout'>,</span>
<a name="line-37"></a>        <span class='hs-varid'>mkTyConEqInstCo</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkFunEqInstCo</span><span class='hs-layout'>,</span>
<a name="line-38"></a>        <span class='hs-varid'>wantedEqInstIsUnsolved</span><span class='hs-layout'>,</span> <span class='hs-varid'>eitherEqInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkEqInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkWantedEqInst</span><span class='hs-layout'>,</span>
<a name="line-39"></a>        <span class='hs-varid'>wantedToLocalEqInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>finalizeEqInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqInstType</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqInstCoercion</span><span class='hs-layout'>,</span>
<a name="line-40"></a>        <span class='hs-varid'>eqInstTys</span>
<a name="line-41"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span>	<span class='hs-conid'>TcExpr</span><span class='hs-layout'>(</span> <span class='hs-varid'>tcPolyExpr</span> <span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span>	<span class='hs-conid'>TcUnify</span><span class='hs-layout'>(</span> <span class='hs-varid'>boxyUnify</span> <span class='hs-comment'>{- , unifyType -}</span> <span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsSyn</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcEnv</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>InstEnv</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FunDeps</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcMType</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MkCore</span> <span class='hs-layout'>(</span> <span class='hs-varid'>mkBigCoreTupTy</span> <span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TypeRep</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unify</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Coercion</span>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreFVs</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-69"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameSet</span>
<a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>      <span class='hs-layout'>(</span> <span class='hs-conid'>Var</span><span class='hs-layout'>,</span> <span class='hs-conid'>TyVar</span> <span class='hs-layout'>)</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Var</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarEnv</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarSet</span>
<a name="line-74"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-75"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-76"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-77"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>
<a name="line-78"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Bag</span>
<a name="line-79"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>
<a name="line-80"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-81"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>
<a name="line-82"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-83"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-84"></a>
<a name="line-85"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
</pre>\end{code}



Selection
~~~~~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="instName"></a><span class='hs-definition'>instName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>
<a name="line-2"></a><span class='hs-definition'>instName</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span>
<a name="line-3"></a><span class='hs-definition'>instName</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>varName</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToVar</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="instToId"></a><span class='hs-definition'>instToId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcId</span>
<a name="line-6"></a><span class='hs-definition'>instToId</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WARN</span><span class='hs-layout'>(</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isId</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>inst</span> <span class='hs-layout'>)</span> 
<a name="line-7"></a>	      <span class='hs-varid'>id</span> 
<a name="line-8"></a>	      <span class='hs-keyword'>where</span>
<a name="line-9"></a>		<span class='hs-varid'>id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instToVar</span> <span class='hs-varid'>inst</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="instToVar"></a><span class='hs-definition'>instToVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Var</span>
<a name="line-12"></a><span class='hs-definition'>instToVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nm</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>ty</span>
<a name="line-14"></a><span class='hs-definition'>instToVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-16"></a><span class='hs-definition'>instToVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nm</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>    
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isEqPred</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkCoVar</span> <span class='hs-varid'>nm</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>nm</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-19"></a><span class='hs-definition'>instToVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nm</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_given</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>givens</span><span class='hs-layout'>,</span>
<a name="line-20"></a>		       <span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-21"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkLocalId</span> <span class='hs-varid'>nm</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkImplicTy</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>givens</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>instToVar</span> <span class='hs-varid'>inst</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eitherEqInst</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>id</span> <span class='hs-varid'>assertCoVar</span>
<a name="line-24"></a>  <span class='hs-keyword'>where</span>
<a name="line-25"></a>    <span class='hs-varid'>assertCoVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cotv</span>
<a name="line-26"></a>    <span class='hs-varid'>assertCoVar</span> <span class='hs-varid'>coty</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Inst.instToVar"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>coty</span><span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="instType"></a><span class='hs-definition'>instType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-29"></a><span class='hs-definition'>instType</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_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'>ty</span>
<a name="line-30"></a><span class='hs-definition'>instType</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_id</span> <span class='hs-keyglyph'>=</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'>idType</span> <span class='hs-varid'>id</span>
<a name="line-31"></a><span class='hs-definition'>instType</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred</span>
<a name="line-32"></a><span class='hs-definition'>instType</span> <span class='hs-varid'>imp</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</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'>mkImplicTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-varid'>imp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_given</span> <span class='hs-varid'>imp</span><span class='hs-layout'>)</span>	
<a name="line-33"></a>					       <span class='hs-layout'>(</span><span class='hs-varid'>tci_wanted</span> <span class='hs-varid'>imp</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-comment'>-- instType i@(EqInst {tci_co = co}) = eitherEqInst i TyVarTy id</span>
<a name="line-35"></a><span class='hs-definition'>instType</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPredTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="mkImplicTy"></a><span class='hs-definition'>mkImplicTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-38"></a><span class='hs-definition'>mkImplicTy</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>givens</span> <span class='hs-varid'>wanteds</span>	<span class='hs-comment'>-- The type of an implication constraint</span>
<a name="line-39"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>all</span> <span class='hs-varid'>isAbstractableInst</span> <span class='hs-varid'>givens</span> <span class='hs-layout'>)</span>
<a name="line-40"></a>    <span class='hs-comment'>-- pprTrace "mkImplicTy" (ppr givens) $</span>
<a name="line-41"></a>    <span class='hs-comment'>-- See [Equational Constraints in Implication Constraints]</span>
<a name="line-42"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>dict_wanteds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>isEqInst</span><span class='hs-layout'>)</span> <span class='hs-varid'>wanteds</span>
<a name="line-43"></a>    <span class='hs-keyword'>in</span> 
<a name="line-44"></a>      <span class='hs-varid'>mkForAllTys</span> <span class='hs-varid'>tvs</span> <span class='hs-varop'>$</span> 
<a name="line-45"></a>      <span class='hs-varid'>mkPhiTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>dictPred</span> <span class='hs-varid'>givens</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-46"></a>      <span class='hs-varid'>mkBigCoreTupTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>instType</span> <span class='hs-varid'>dict_wanteds</span><span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="dictPred"></a><span class='hs-definition'>dictPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPredType</span>
<a name="line-49"></a><span class='hs-definition'>dictPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span>
<a name="line-50"></a><span class='hs-definition'>dictPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>ty1</span><span class='hs-layout'>,</span><span class='hs-varid'>tci_right</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-51"></a><span class='hs-definition'>dictPred</span> <span class='hs-varid'>inst</span>		          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"dictPred"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="getDictClassTys"></a><span class='hs-definition'>getDictClassTys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Class</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-54"></a><span class='hs-definition'>getDictClassTys</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getClassPredTys</span> <span class='hs-varid'>pred</span>
<a name="line-55"></a><span class='hs-definition'>getDictClassTys</span> <span class='hs-varid'>inst</span>		         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"getDictClassTys"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="fdPredsOfInst"></a><span class='hs-comment'>--------------------------------</span>
<a name="line-58"></a><span class='hs-comment'>-- fdPredsOfInst is used to get predicates that contain functional </span>
<a name="line-59"></a><span class='hs-comment'>-- dependencies *or* might do so.  The "might do" part is because</span>
<a name="line-60"></a><span class='hs-comment'>-- a constraint (C a b) might have a superclass with FDs</span>
<a name="line-61"></a><span class='hs-comment'>-- Leaving these in is really important for the call to fdPredsOfInsts</span>
<a name="line-62"></a><span class='hs-comment'>-- in TcSimplify.inferLoop, because the result is fed to 'grow',</span>
<a name="line-63"></a><span class='hs-comment'>-- which is supposed to be conservative</span>
<a name="line-64"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcPredType</span><span class='hs-keyglyph'>]</span>
<a name="line-65"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 	     <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pred</span><span class='hs-keyglyph'>]</span>
<a name="line-66"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span>
<a name="line-67"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ws</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fdPredsOfInsts</span> <span class='hs-varid'>ws</span>
<a name="line-68"></a>   <span class='hs-comment'>-- The ImplicInst case doesn't look right;</span>
<a name="line-69"></a>   <span class='hs-comment'>-- what if ws mentions skolem variables?</span>
<a name="line-70"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</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'>[]</span>
<a name="line-71"></a><span class='hs-definition'>fdPredsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</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'>[]</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="fdPredsOfInsts"></a><span class='hs-definition'>fdPredsOfInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PredType</span><span class='hs-keyglyph'>]</span>
<a name="line-74"></a><span class='hs-definition'>fdPredsOfInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>fdPredsOfInst</span> <span class='hs-varid'>insts</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="isInheritableInst"></a><span class='hs-comment'>---------------------------------</span>
<a name="line-77"></a><span class='hs-definition'>isInheritableInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-78"></a><span class='hs-definition'>isInheritableInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isInheritablePred</span> <span class='hs-varid'>pred</span>
<a name="line-79"></a><span class='hs-definition'>isInheritableInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>all</span> <span class='hs-varid'>isInheritablePred</span> <span class='hs-varid'>theta</span>
<a name="line-80"></a><span class='hs-definition'>isInheritableInst</span> <span class='hs-keyword'>_</span>                            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-81"></a>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-comment'>---------------------------------</span>
<a name="line-84"></a><span class='hs-comment'>-- Get the implicit parameters mentioned by these Insts</span>
<a name="line-85"></a><span class='hs-comment'>-- NB: the results of these functions are insensitive to zonking</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="ipNamesOfInsts"></a><span class='hs-definition'>ipNamesOfInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-88"></a><a name="ipNamesOfInst"></a><span class='hs-definition'>ipNamesOfInst</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-89"></a><span class='hs-definition'>ipNamesOfInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>insts</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ipNamesOfInst</span> <span class='hs-varid'>inst</span><span class='hs-keyglyph'>]</span>
<a name="line-90"></a>
<a name="line-91"></a><span class='hs-definition'>ipNamesOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IParam</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>_</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ipNameName</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span>
<a name="line-92"></a><span class='hs-definition'>ipNamesOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ipNameName</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>IParam</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>theta</span><span class='hs-keyglyph'>]</span>
<a name="line-93"></a><span class='hs-definition'>ipNamesOfInst</span> <span class='hs-keyword'>_</span>                              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-94"></a>
<a name="line-95"></a><span class='hs-comment'>---------------------------------</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="tyVarsOfInst"></a><span class='hs-comment'>-- |All free type variables (not including the coercion variables of</span>
<a name="line-98"></a><span class='hs-comment'>-- equalities)</span>
<a name="line-99"></a><span class='hs-comment'>--</span>
<a name="line-100"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-101"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_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'>tyVarsOfType</span>  <span class='hs-varid'>ty</span>
<a name="line-102"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyVarsOfPred</span> <span class='hs-varid'>pred</span>
<a name="line-103"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-104"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyVarsOfTypes</span> <span class='hs-varid'>tys</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>varTypeTyVars</span> <span class='hs-varid'>id</span>
<a name="line-105"></a>    <span class='hs-comment'>-- The id might have free type variables; in the case of</span>
<a name="line-106"></a>    <span class='hs-comment'>-- locally-overloaded class methods, for example</span>
<a name="line-107"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_given</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>givens</span><span class='hs-layout'>,</span> 
<a name="line-108"></a>                          <span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-109"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyVarsOfInsts</span> <span class='hs-varid'>givens</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>tyVarsOfInsts</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>)</span> 
<a name="line-110"></a>    <span class='hs-varop'>`minusVarSet`</span> <span class='hs-varid'>mkVarSet</span> <span class='hs-varid'>tvs</span>
<a name="line-111"></a>    <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>unionVarSets</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>varTypeTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span>
<a name="line-112"></a>		<span class='hs-comment'>-- Remember the free tyvars of a coercion</span>
<a name="line-113"></a><span class='hs-definition'>tyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-114"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyVarsOfType</span> <span class='hs-varid'>ty1</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>tyVarsOfType</span> <span class='hs-varid'>ty2</span>
<a name="line-115"></a>
<a name="line-116"></a><a name="tcTyVarsOfInst"></a><span class='hs-comment'>-- |All free meta type variables *including* the coercion variables of</span>
<a name="line-117"></a><span class='hs-comment'>-- equalities</span>
<a name="line-118"></a><span class='hs-comment'>--</span>
<a name="line-119"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-120"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_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'>tcTyVarsOfType</span>  <span class='hs-varid'>ty</span>
<a name="line-121"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcTyVarsOfPred</span> <span class='hs-varid'>pred</span>
<a name="line-122"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-123"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcTyVarsOfTypes</span> <span class='hs-varid'>tys</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>varTypeTcTyVars</span> <span class='hs-varid'>id</span>
<a name="line-124"></a>    <span class='hs-comment'>-- The id might have free type variables; in the case of</span>
<a name="line-125"></a>    <span class='hs-comment'>-- locally-overloaded class methods, for example</span>
<a name="line-126"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_given</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>givens</span><span class='hs-layout'>,</span> 
<a name="line-127"></a>                            <span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-128"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcTyVarsOfInsts</span> <span class='hs-varid'>givens</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>tcTyVarsOfInsts</span> <span class='hs-varid'>wanteds</span><span class='hs-layout'>)</span> 
<a name="line-129"></a>    <span class='hs-varop'>`minusVarSet`</span> <span class='hs-varid'>mkVarSet</span> <span class='hs-varid'>tvs</span>
<a name="line-130"></a>    <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>unionVarSets</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>varTypeTcTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span>
<a name="line-131"></a>		<span class='hs-comment'>-- Remember the free tyvars of a coercion</span>
<a name="line-132"></a><span class='hs-definition'>tcTyVarsOfInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-133"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>either</span> <span class='hs-varid'>unitVarSet</span> <span class='hs-varid'>tcTyVarsOfType</span> <span class='hs-varid'>co</span> <span class='hs-varop'>`unionVarSet`</span>   <span class='hs-comment'>-- include covars</span>
<a name="line-134"></a>    <span class='hs-varid'>tcTyVarsOfType</span> <span class='hs-varid'>ty1</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>tcTyVarsOfType</span> <span class='hs-varid'>ty2</span>
<a name="line-135"></a>
<a name="line-136"></a><a name="tyVarsOfInsts"></a><span class='hs-definition'>tyVarsOfInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-137"></a><span class='hs-definition'>tyVarsOfInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-varid'>unionVarSet</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tyVarsOfInst</span><span class='hs-layout'>)</span> <span class='hs-varid'>emptyVarSet</span> <span class='hs-varid'>insts</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="tcTyVarsOfInsts"></a><span class='hs-definition'>tcTyVarsOfInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcTyVarSet</span>
<a name="line-140"></a><span class='hs-definition'>tcTyVarsOfInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-varid'>unionVarSet</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tcTyVarsOfInst</span><span class='hs-layout'>)</span> <span class='hs-varid'>emptyVarSet</span> <span class='hs-varid'>insts</span>
<a name="line-141"></a>
<a name="line-142"></a><a name="tyVarsOfLIE"></a><span class='hs-definition'>tyVarsOfLIE</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bag</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-143"></a><span class='hs-definition'>tyVarsOfLIE</span>   <span class='hs-varid'>lie</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyVarsOfInsts</span> <span class='hs-layout'>(</span><span class='hs-varid'>lieToList</span> <span class='hs-varid'>lie</span><span class='hs-layout'>)</span>
<a name="line-144"></a>
<a name="line-145"></a>
<a name="line-146"></a><a name="instToDictBind"></a><span class='hs-comment'>--------------------------</span>
<a name="line-147"></a><span class='hs-definition'>instToDictBind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcDictBinds</span>
<a name="line-148"></a><span class='hs-definition'>instToDictBind</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>rhs</span> 
<a name="line-149"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unitBag</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-layout'>(</span><span class='hs-varid'>instSpan</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarBind</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToId</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-150"></a>
<a name="line-151"></a><a name="addInstToDictBind"></a><span class='hs-definition'>addInstToDictBind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcDictBinds</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcDictBinds</span>
<a name="line-152"></a><span class='hs-definition'>addInstToDictBind</span> <span class='hs-varid'>binds</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>rhs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>binds</span> <span class='hs-varop'>`unionBags`</span> <span class='hs-varid'>instToDictBind</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>rhs</span>
</pre>\end{code}

Note [Growing the tau-tvs using constraints]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(growInstsTyVars insts tvs) is the result of extending the set 
    of tyvars tvs using all conceivable links from pred

E.g. tvs = {a}, preds = {H [a] b, K (b,Int) c, Eq e}
Then grow precs tvs = {a,b,c}

All the type variables from an implicit parameter are added, whether or
not they are mentioned in tvs; see Note [Implicit parameters and ambiguity] 
in TcSimplify.

See also Note [Ambiguity] in TcSimplify

\begin{code}
<pre><a name="line-1"></a><a name="growInstsTyVars"></a><span class='hs-definition'>growInstsTyVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-2"></a><span class='hs-definition'>growInstsTyVars</span> <span class='hs-varid'>insts</span> <span class='hs-varid'>tvs</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</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'>fixVarSet</span> <span class='hs-varid'>mk_next</span> <span class='hs-varid'>tvs</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>    <span class='hs-varid'>mk_next</span> <span class='hs-varid'>tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>grow_inst_tvs</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>insts</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="grow_inst_tvs"></a><span class='hs-definition'>grow_inst_tvs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-9"></a><span class='hs-definition'>grow_inst_tvs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>     <span class='hs-varid'>tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>growPredTyVars</span> <span class='hs-varid'>pred</span> <span class='hs-varid'>tvs</span>
<a name="line-10"></a><span class='hs-definition'>grow_inst_tvs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>growPredTyVars</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>theta</span>
<a name="line-11"></a><span class='hs-definition'>grow_inst_tvs</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ws</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>tvs</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr</span> <span class='hs-varid'>grow_inst_tvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs</span> <span class='hs-varop'>`delVarSetList`</span> <span class='hs-varid'>tvs1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ws</span>
<a name="line-13"></a>    		          <span class='hs-varop'>`delVarSetList`</span> <span class='hs-varid'>tvs1</span><span class='hs-layout'>)</span>
<a name="line-14"></a><span class='hs-definition'>grow_inst_tvs</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>tvs</span>   <span class='hs-comment'>-- EqInst, LitInst</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>growTyVars</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyVarsOfInst</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span> <span class='hs-varid'>tvs</span>
</pre>\end{code}


%************************************************************************
%*									*
		Predicates
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="isAbstractableInst"></a><span class='hs-definition'>isAbstractableInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-3"></a><span class='hs-definition'>isAbstractableInst</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDict</span> <span class='hs-varid'>inst</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isEqInst</span> <span class='hs-varid'>inst</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="isEqInst"></a><span class='hs-definition'>isEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-6"></a><span class='hs-definition'>isEqInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</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-7"></a><span class='hs-definition'>isEqInst</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="isDict"></a><span class='hs-definition'>isDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-10"></a><span class='hs-definition'>isDict</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</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-11"></a><span class='hs-definition'>isDict</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="isClassDict"></a><span class='hs-definition'>isClassDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a><span class='hs-definition'>isClassDict</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isClassPred</span> <span class='hs-varid'>pred</span>
<a name="line-15"></a><span class='hs-definition'>isClassDict</span> <span class='hs-keyword'>_</span>                        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="isTyVarDict"></a><span class='hs-definition'>isTyVarDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-18"></a><span class='hs-definition'>isTyVarDict</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isTyVarClassPred</span> <span class='hs-varid'>pred</span>
<a name="line-19"></a><span class='hs-definition'>isTyVarDict</span> <span class='hs-keyword'>_</span>                        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="isIPDict"></a><span class='hs-definition'>isIPDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-22"></a><span class='hs-definition'>isIPDict</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isIPPred</span> <span class='hs-varid'>pred</span>
<a name="line-23"></a><span class='hs-definition'>isIPDict</span> <span class='hs-keyword'>_</span>                        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="isImplicInst"></a><span class='hs-definition'>isImplicInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-26"></a><span class='hs-definition'>isImplicInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</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-27"></a><span class='hs-definition'>isImplicInst</span> <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="isMethod"></a><span class='hs-definition'>isMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-30"></a><span class='hs-definition'>isMethod</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</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-31"></a><span class='hs-definition'>isMethod</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="isMethodFor"></a><span class='hs-definition'>isMethodFor</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcIdSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-34"></a><span class='hs-definition'>isMethodFor</span> <span class='hs-varid'>ids</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</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'>`elemVarSet`</span> <span class='hs-varid'>ids</span>
<a name="line-35"></a><span class='hs-definition'>isMethodFor</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-36"></a>
<a name="line-37"></a><a name="isMethodOrLit"></a><span class='hs-definition'>isMethodOrLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-38"></a><span class='hs-definition'>isMethodOrLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</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-39"></a><span class='hs-definition'>isMethodOrLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</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-40"></a><span class='hs-definition'>isMethodOrLit</span> <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Building dictionaries}
%*									*
%************************************************************************

-- newDictBndrs makes a dictionary at a binding site
-- instCall makes a dictionary at an occurrence site
--	and throws it into the LIE

\begin{code}
<pre><a name="line-1"></a><a name="newDictBndrsO"></a><span class='hs-comment'>----------------</span>
<a name="line-2"></a><span class='hs-definition'>newDictBndrsO</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a><span class='hs-definition'>newDictBndrsO</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-4"></a>			      <span class='hs-layout'>;</span> <span class='hs-varid'>newDictBndrs</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>theta</span> <span class='hs-layout'>}</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="newDictBndrs"></a><span class='hs-definition'>newDictBndrs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a><span class='hs-definition'>newDictBndrs</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>newDictBndr</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>)</span> <span class='hs-varid'>theta</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="newDictBndr"></a><span class='hs-definition'>newDictBndr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-10"></a><span class='hs-comment'>-- Makes a "given"</span>
<a name="line-11"></a><span class='hs-definition'>newDictBndr</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span> 
<a name="line-13"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPredName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span> 
<a name="line-14"></a>	      <span class='hs-varid'>co</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkGivenCo</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TyVarTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkCoVar</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-conid'>PredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-15"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> 
<a name="line-16"></a>			  <span class='hs-varid'>tci_loc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>,</span> 
<a name="line-17"></a>			  <span class='hs-varid'>tci_left</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> 
<a name="line-18"></a>			  <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>,</span> 
<a name="line-19"></a>			  <span class='hs-varid'>tci_co</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-definition'>newDictBndr</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDict</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="newDictOccs"></a><span class='hs-comment'>-------------------</span>
<a name="line-24"></a><span class='hs-definition'>newDictOccs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span>
<a name="line-25"></a><span class='hs-definition'>newDictOccs</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>newDictOcc</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>)</span> <span class='hs-varid'>theta</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="newDictOcc"></a><span class='hs-definition'>newDictOcc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-28"></a><span class='hs-comment'>-- Makes a "wanted"</span>
<a name="line-29"></a><span class='hs-definition'>newDictOcc</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-30"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span> 
<a name="line-31"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>cotv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-32"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPredName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span> 
<a name="line-33"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> 
<a name="line-34"></a>			  <span class='hs-varid'>tci_loc</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>,</span> 
<a name="line-35"></a>			  <span class='hs-varid'>tci_left</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> 
<a name="line-36"></a>			  <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>,</span> 
<a name="line-37"></a>			  <span class='hs-varid'>tci_co</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-definition'>newDictOcc</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>newDict</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="newDict"></a><span class='hs-comment'>----------------</span>
<a name="line-42"></a><span class='hs-definition'>newDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-43"></a><span class='hs-comment'>-- Always makes a Dict, not an EqInst</span>
<a name="line-44"></a><span class='hs-definition'>newDict</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span>
<a name="line-45"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span> 
<a name="line-46"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPredName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>pred</span> 
<a name="line-47"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="instCall"></a><span class='hs-comment'>----------------</span>
<a name="line-50"></a><span class='hs-definition'>instCall</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>HsWrapper</span>
<a name="line-51"></a><span class='hs-comment'>-- Instantiate the constraints of a call</span>
<a name="line-52"></a><span class='hs-comment'>--	(instCall o tys theta)</span>
<a name="line-53"></a><span class='hs-comment'>-- (a) Makes fresh dictionaries as necessary for the constraints (theta)</span>
<a name="line-54"></a><span class='hs-comment'>-- (b) Throws these dictionaries into the LIE</span>
<a name="line-55"></a><span class='hs-comment'>-- (c) Returns an HsWrapper ([.] tys dicts)</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-definition'>instCall</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>tys</span> <span class='hs-varid'>theta</span> 
<a name="line-58"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-59"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>dict_app</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>theta</span>
<a name="line-60"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>dict_app</span> <span class='hs-varop'>&lt;.&gt;</span> <span class='hs-varid'>mkWpTyApps</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="instStupidTheta"></a><span class='hs-comment'>----------------</span>
<a name="line-63"></a><span class='hs-definition'>instStupidTheta</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-64"></a><span class='hs-comment'>-- Similar to instCall, but only emit the constraints in the LIE</span>
<a name="line-65"></a><span class='hs-comment'>-- Used exclusively for the 'stupid theta' of a data constructor</span>
<a name="line-66"></a><span class='hs-definition'>instStupidTheta</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>theta</span>
<a name="line-67"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-68"></a>	<span class='hs-layout'>;</span> <span class='hs-sel'>_co</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>theta</span>	<span class='hs-comment'>-- Discard the coercion</span>
<a name="line-69"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span> <span class='hs-layout'>}</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="instCallDicts"></a><span class='hs-comment'>----------------</span>
<a name="line-72"></a><span class='hs-definition'>instCallDicts</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>HsWrapper</span>
<a name="line-73"></a><span class='hs-comment'>-- Instantiates the TcTheta, puts all constraints thereby generated</span>
<a name="line-74"></a><span class='hs-comment'>-- into the LIE, and returns a HsWrapper to enclose the call site.</span>
<a name="line-75"></a><span class='hs-comment'>-- This is the key place where equality predicates </span>
<a name="line-76"></a><span class='hs-comment'>-- are unleashed into the world</span>
<a name="line-77"></a><span class='hs-definition'>instCallDicts</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>idHsWrapper</span>
<a name="line-78"></a>
<a name="line-79"></a><span class='hs-comment'>-- instCallDicts loc (EqPred ty1 ty2 : preds)</span>
<a name="line-80"></a><span class='hs-comment'>--   = do  { unifyType ty1 ty2	-- For now, we insist that they unify right away </span>
<a name="line-81"></a><span class='hs-comment'>-- 				-- Later on, when we do associated types, </span>
<a name="line-82"></a><span class='hs-comment'>-- 				-- unifyType :: Type -&gt; Type -&gt; TcM ([Inst], Coercion)</span>
<a name="line-83"></a><span class='hs-comment'>-- 	; (dicts, co_fn) &lt;- instCallDicts loc preds</span>
<a name="line-84"></a><span class='hs-comment'>-- 	; return (dicts, co_fn &lt;.&gt; WpTyApp ty1) }</span>
<a name="line-85"></a><span class='hs-comment'>-- 	-- We use type application to apply the function to the </span>
<a name="line-86"></a><span class='hs-comment'>-- 	-- coercion; here ty1 *is* the appropriate identity coercion</span>
<a name="line-87"></a>
<a name="line-88"></a><span class='hs-definition'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span> <span class='hs-conop'>:</span> <span class='hs-varid'>preds</span><span class='hs-layout'>)</span>
<a name="line-89"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>  <span class='hs-layout'>{</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"instCallDicts"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-90"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>coi</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>boxyUnify</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-91"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromCoI</span> <span class='hs-varid'>coi</span> <span class='hs-varid'>ty1</span>
<a name="line-92"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>co_fn</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>preds</span>
<a name="line-93"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>co_fn</span> <span class='hs-varop'>&lt;.&gt;</span> <span class='hs-conid'>WpTyApp</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-94"></a>
<a name="line-95"></a><span class='hs-definition'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-varid'>pred</span> <span class='hs-conop'>:</span> <span class='hs-varid'>preds</span><span class='hs-layout'>)</span>
<a name="line-96"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>dict</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newDict</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>pred</span>
<a name="line-97"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>extendLIE</span> <span class='hs-varid'>dict</span>
<a name="line-98"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>co_fn</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>preds</span>
<a name="line-99"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>co_fn</span> <span class='hs-varop'>&lt;.&gt;</span> <span class='hs-conid'>WpApp</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToId</span> <span class='hs-varid'>dict</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="cloneDict"></a><span class='hs-comment'>-------------</span>
<a name="line-102"></a><span class='hs-definition'>cloneDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-103"></a><span class='hs-definition'>cloneDict</span> <span class='hs-varid'>dict</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-varid'>nm</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span>
<a name="line-104"></a>				  <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setNameUnique</span> <span class='hs-varid'>nm</span> <span class='hs-varid'>uniq</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-105"></a><span class='hs-definition'>cloneDict</span> <span class='hs-varid'>eq</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</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'>return</span> <span class='hs-varid'>eq</span>
<a name="line-106"></a><span class='hs-definition'>cloneDict</span> <span class='hs-varid'>other</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"cloneDict"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
<a name="line-107"></a>
<a name="line-108"></a><a name="newIPDict"></a><span class='hs-comment'>-- For vanilla implicit parameters, there is only one in scope</span>
<a name="line-109"></a><span class='hs-comment'>-- at any time, so we used to use the name of the implicit parameter itself</span>
<a name="line-110"></a><span class='hs-comment'>-- But with splittable implicit parameters there may be many in </span>
<a name="line-111"></a><span class='hs-comment'>-- scope, so we make up a new namea.</span>
<a name="line-112"></a><span class='hs-definition'>newIPDict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IPName</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> 
<a name="line-113"></a>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-conid'>Id</span><span class='hs-layout'>,</span> <span class='hs-conid'>Inst</span><span class='hs-layout'>)</span>
<a name="line-114"></a><span class='hs-definition'>newIPDict</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>ip_name</span> <span class='hs-varid'>ty</span>
<a name="line-115"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>inst_loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-116"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>dict</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newDict</span> <span class='hs-varid'>inst_loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>IParam</span> <span class='hs-varid'>ip_name</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-117"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapIPName</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>instToId</span> <span class='hs-varid'>dict</span><span class='hs-layout'>)</span> <span class='hs-varid'>ip_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>dict</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="mkPredName"></a><span class='hs-definition'>mkPredName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unique</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>
<a name="line-2"></a><span class='hs-definition'>mkPredName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>pred_ty</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>occ</span> <span class='hs-layout'>(</span><span class='hs-varid'>instLocSpan</span> <span class='hs-varid'>loc</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-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>pred_ty</span> <span class='hs-keyword'>of</span>
<a name="line-6"></a>	    <span class='hs-conid'>ClassP</span> <span class='hs-varid'>cls</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkDictOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>getOccName</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span>
<a name="line-7"></a>	    <span class='hs-conid'>IParam</span> <span class='hs-varid'>ip</span>  <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getOccName</span> <span class='hs-layout'>(</span><span class='hs-varid'>ipNameName</span> <span class='hs-varid'>ip</span><span class='hs-layout'>)</span>
<a name="line-8"></a>	    <span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty</span>  <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkEqPredCoOcc</span> <span class='hs-varid'>baseOcc</span>
<a name="line-9"></a>	      <span class='hs-keyword'>where</span>
<a name="line-10"></a>		<span class='hs-comment'>-- we use the outermost tycon of the lhs, if there is one, to</span>
<a name="line-11"></a>		<span class='hs-comment'>-- improve readability of Core code</span>
<a name="line-12"></a>	        <span class='hs-varid'>baseOcc</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>splitTyConApp_maybe</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>			    <span class='hs-conid'>Nothing</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mkTcOcc</span> <span class='hs-str'>"$"</span>
<a name="line-14"></a>                            <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getOccName</span> <span class='hs-varid'>tc</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Building methods (calls of overloaded functions)}
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="newMethodFromName"></a><span class='hs-definition'>newMethodFromName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BoxyRhoType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcId</span>
<a name="line-2"></a><span class='hs-definition'>newMethodFromName</span> <span class='hs-varid'>origin</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>    <span class='hs-varid'>id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupId</span> <span class='hs-varid'>name</span>
<a name="line-4"></a>	<span class='hs-comment'>-- Use tcLookupId not tcLookupGlobalId; the method is almost</span>
<a name="line-5"></a>	<span class='hs-comment'>-- always a class op, but with -XNoImplicitPrelude GHC is</span>
<a name="line-6"></a>	<span class='hs-comment'>-- meant to find whatever thing is in scope, and that may</span>
<a name="line-7"></a>	<span class='hs-comment'>-- be an ordinary function. </span>
<a name="line-8"></a>    <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>origin</span>
<a name="line-9"></a>    <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInstClassOp</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a>    <span class='hs-varid'>extendLIE</span> <span class='hs-varid'>inst</span>
<a name="line-11"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToId</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="newMethodWithGivenTy"></a><span class='hs-definition'>newMethodWithGivenTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>TcId</span>
<a name="line-14"></a><span class='hs-definition'>newMethodWithGivenTy</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>id</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-15"></a>    <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-16"></a>    <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMethod</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>id</span> <span class='hs-varid'>tys</span>
<a name="line-17"></a>    <span class='hs-varid'>extendLIE</span> <span class='hs-varid'>inst</span>
<a name="line-18"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToId</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-comment'>--------------------------------------------</span>
<a name="line-21"></a><span class='hs-comment'>-- tcInstClassOp, and newMethod do *not* drop the </span>
<a name="line-22"></a><span class='hs-comment'>-- Inst into the LIE; they just returns the Inst</span>
<a name="line-23"></a><span class='hs-comment'>-- This is important because they are used by TcSimplify</span>
<a name="line-24"></a><span class='hs-comment'>-- to simplify Insts</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="tcInstClassOp"></a><span class='hs-comment'>-- NB: the kind of the type variable to be instantiated</span>
<a name="line-27"></a><span class='hs-comment'>--     might be a sub-kind of the type to which it is applied,</span>
<a name="line-28"></a><span class='hs-comment'>--     notably when the latter is a type variable of kind ??</span>
<a name="line-29"></a><span class='hs-comment'>--     Hence the call to checkKind</span>
<a name="line-30"></a><span class='hs-comment'>-- A worry: is this needed anywhere else?</span>
<a name="line-31"></a><span class='hs-definition'>tcInstClassOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-32"></a><span class='hs-definition'>tcInstClassOp</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>sel_id</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-33"></a>    <span class='hs-keyword'>let</span>
<a name="line-34"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-sel'>_rho</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitForAllTys</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>sel_id</span><span class='hs-layout'>)</span>
<a name="line-35"></a>    <span class='hs-varid'>zipWithM_</span> <span class='hs-varid'>checkKind</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>tys</span>
<a name="line-36"></a>    <span class='hs-varid'>newMethod</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>sel_id</span> <span class='hs-varid'>tys</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="checkKind"></a><span class='hs-definition'>checkKind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyVar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-39"></a><span class='hs-comment'>-- Ensure that the type has a sub-kind of the tyvar</span>
<a name="line-40"></a><span class='hs-definition'>checkKind</span> <span class='hs-varid'>tv</span> <span class='hs-varid'>ty</span>
<a name="line-41"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>ty1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> 
<a name="line-42"></a>		<span class='hs-comment'>-- ty1 &lt;- zonkTcType ty</span>
<a name="line-43"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>typeKind</span> <span class='hs-varid'>ty1</span> <span class='hs-varop'>`isSubKind`</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>tyVarKind</span> <span class='hs-varid'>tv</span>
<a name="line-44"></a>	  <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-45"></a>	  <span class='hs-keyword'>else</span> 
<a name="line-46"></a>
<a name="line-47"></a>    <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"checkKind: adding kind constraint"</span> 
<a name="line-48"></a>	     <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>tv</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>tyVarKind</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-49"></a>	            <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty1</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>typeKind</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-50"></a>	<span class='hs-layout'>}</span>
<a name="line-51"></a><span class='hs-comment'>--    do	{ tv1 &lt;- tcInstTyVar tv</span>
<a name="line-52"></a><span class='hs-comment'>--	; unifyType ty1 (mkTyVarTy tv1) } }</span>
<a name="line-53"></a>
<a name="line-54"></a>
<a name="line-55"></a><a name="newMethod"></a><span class='hs-comment'>---------------------------</span>
<a name="line-56"></a><span class='hs-definition'>newMethod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>Inst</span>
<a name="line-57"></a><span class='hs-definition'>newMethod</span> <span class='hs-varid'>inst_loc</span> <span class='hs-varid'>id</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-58"></a>    <span class='hs-varid'>new_uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span>
<a name="line-59"></a>    <span class='hs-keyword'>let</span>
<a name="line-60"></a>	<span class='hs-layout'>(</span><span class='hs-varid'>theta</span><span class='hs-layout'>,</span><span class='hs-varid'>tau</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitPhiTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>applyTys</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-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-61"></a>	<span class='hs-varid'>meth_id</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUserLocal</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkMethodOcc</span> <span class='hs-layout'>(</span><span class='hs-varid'>getOccName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>new_uniq</span> <span class='hs-varid'>tau</span> <span class='hs-varid'>loc</span>
<a name="line-62"></a>	<span class='hs-varid'>inst</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>meth_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>,</span>
<a name="line-63"></a>			      <span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>}</span>
<a name="line-64"></a>	<span class='hs-varid'>loc</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instLocSpan</span> <span class='hs-varid'>inst_loc</span>
<a name="line-65"></a>    
<a name="line-66"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>inst</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkOverLit"></a><span class='hs-definition'>mkOverLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OverLitVal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>HsLit</span>
<a name="line-2"></a><span class='hs-definition'>mkOverLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIntegral</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> 
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>integer_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>integerTyConName</span>
<a name="line-4"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsInteger</span> <span class='hs-varid'>i</span> <span class='hs-varid'>integer_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>mkOverLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFractional</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>rat_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>rationalTyConName</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsRat</span> <span class='hs-varid'>r</span> <span class='hs-varid'>rat_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-definition'>mkOverLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Zonking}
%*									*
%************************************************************************

Zonking makes sure that the instance types are fully zonked.

\begin{code}
<pre><a name="line-1"></a><a name="zonkInst"></a><span class='hs-definition'>zonkInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-2"></a><span class='hs-definition'>zonkInst</span> <span class='hs-varid'>dict</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>    <span class='hs-varid'>new_pred</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcPredType</span> <span class='hs-varid'>pred</span>
<a name="line-4"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-definition'>zonkInst</span> <span class='hs-varid'>meth</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-7"></a>    <span class='hs-varid'>new_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkId</span> <span class='hs-varid'>id</span>
<a name="line-8"></a>	<span class='hs-comment'>-- Essential to zonk the id in case it's a local variable</span>
<a name="line-9"></a>	<span class='hs-comment'>-- Can't use zonkIdOcc because the id might itself be</span>
<a name="line-10"></a>	<span class='hs-comment'>-- an InstId, in which case it won't be in scope</span>
<a name="line-11"></a>
<a name="line-12"></a>    <span class='hs-varid'>new_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcTypes</span> <span class='hs-varid'>tys</span>
<a name="line-13"></a>    <span class='hs-varid'>new_theta</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcThetaType</span> <span class='hs-varid'>theta</span>
<a name="line-14"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>meth</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_tys</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_theta</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-15"></a>	<span class='hs-comment'>-- No need to zonk the tci_id</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-definition'>zonkInst</span> <span class='hs-varid'>lit</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_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-keyword'>do</span>
<a name="line-18"></a>    <span class='hs-varid'>new_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>ty</span>
<a name="line-19"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>lit</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>new_ty</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-definition'>zonkInst</span> <span class='hs-varid'>implic</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-22"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>all</span> <span class='hs-varid'>isImmutableTyVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-varid'>implic</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-23"></a>    <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>givens'</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkInsts</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_given</span>  <span class='hs-varid'>implic</span><span class='hs-layout'>)</span>
<a name="line-24"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>wanteds'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkInsts</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_wanted</span> <span class='hs-varid'>implic</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>implic</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_given</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>givens'</span><span class='hs-layout'>,</span><span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wanteds'</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-definition'>zonkInst</span> <span class='hs-varid'>eqinst</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-28"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>co'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>eitherEqInst</span> <span class='hs-varid'>eqinst</span> 
<a name="line-29"></a>		  <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>covar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWantedCo</span> <span class='hs-varid'>covar</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-30"></a>		  <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>co</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>mkGivenCo</span> <span class='hs-varop'>$</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>
<a name="line-31"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>ty1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>ty1</span>
<a name="line-32"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>ty2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>ty2</span>
<a name="line-33"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>eqinst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2'</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-34"></a>       <span class='hs-layout'>}</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="zonkInsts"></a><span class='hs-definition'>zonkInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a><span class='hs-definition'>zonkInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>zonkInst</span> <span class='hs-varid'>insts</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Printing}
%*									*
%************************************************************************

ToDo: improve these pretty-printing things.  The ``origin'' is really only
relevant in error messages.

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Inst</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>ppr</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprInst</span> <span class='hs-varid'>inst</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="pprDictsTheta"></a><span class='hs-definition'>pprDictsTheta</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-5"></a><span class='hs-comment'>-- Print in type-like fashion (Eq a, Show b)</span>
<a name="line-6"></a><span class='hs-comment'>-- The Inst can be an implication constraint, but not a Method or LitInst</span>
<a name="line-7"></a><span class='hs-definition'>pprDictsTheta</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>instType</span><span class='hs-layout'>)</span> <span class='hs-varid'>insts</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="pprDictsInFull"></a><span class='hs-definition'>pprDictsInFull</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-10"></a><span class='hs-comment'>-- Print in type-like fashion, but with source location</span>
<a name="line-11"></a><span class='hs-definition'>pprDictsInFull</span> <span class='hs-varid'>dicts</span> 
<a name="line-12"></a>  <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'>go</span> <span class='hs-varid'>dicts</span><span class='hs-layout'>)</span>
<a name="line-13"></a>  <span class='hs-keyword'>where</span>
<a name="line-14"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>dict</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>instType</span> <span class='hs-varid'>dict</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprInstArising</span> <span class='hs-varid'>dict</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="pprInsts"></a><span class='hs-definition'>pprInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-17"></a><span class='hs-comment'>-- Debugging: print the evidence :: type</span>
<a name="line-18"></a><span class='hs-definition'>pprInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>interpp'SP</span> <span class='hs-varid'>insts</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="pprInst"></a><span class='hs-definition'>pprInst</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprInstInFull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-21"></a><span class='hs-comment'>-- Debugging: print the evidence :: type</span>
<a name="line-22"></a><span class='hs-definition'>pprInst</span> <span class='hs-varid'>i</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-23"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>eitherEqInst</span> <span class='hs-varid'>i</span>
<a name="line-24"></a>		<span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>covar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Wanted"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>covar</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>dcolon</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-25"></a>		<span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>co</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Given"</span>  <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>co</span>              <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>dcolon</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-definition'>pprInst</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>braces</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprUnique</span> <span class='hs-layout'>(</span><span class='hs-varid'>getUnique</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>dcolon</span> 
<a name="line-27"></a>		<span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>braces</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>instType</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>implicWantedEqs</span><span class='hs-layout'>)</span>
<a name="line-28"></a>  <span class='hs-keyword'>where</span>
<a name="line-29"></a>    <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instName</span> <span class='hs-varid'>inst</span>
<a name="line-30"></a>    <span class='hs-varid'>implicWantedEqs</span>
<a name="line-31"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isImplicInst</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>" &amp;"</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-32"></a>                            <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-varid'>isEqInst</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_wanted</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-33"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="pprInstInFull"></a><span class='hs-definition'>pprInstInFull</span> <span class='hs-varid'>inst</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</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'>pprInst</span> <span class='hs-varid'>inst</span>
<a name="line-36"></a><span class='hs-definition'>pprInstInFull</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprInst</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprInstArising</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="tidyInst"></a><span class='hs-definition'>tidyInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TidyEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span>
<a name="line-39"></a><span class='hs-definition'>tidyInst</span> <span class='hs-varid'>env</span> <span class='hs-varid'>eq</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lty</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rty</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-40"></a>  <span class='hs-varid'>eq</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_left</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyType</span> <span class='hs-varid'>env</span> <span class='hs-varid'>lty</span>
<a name="line-41"></a>     <span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyType</span> <span class='hs-varid'>env</span> <span class='hs-varid'>rty</span>
<a name="line-42"></a>     <span class='hs-layout'>,</span> <span class='hs-varid'>tci_co</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>either</span> <span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tidyType</span> <span class='hs-varid'>env</span><span class='hs-layout'>)</span> <span class='hs-varid'>co</span>
<a name="line-43"></a>     <span class='hs-layout'>}</span>
<a name="line-44"></a><span class='hs-definition'>tidyInst</span> <span class='hs-varid'>env</span> <span class='hs-varid'>lit</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_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'>lit</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyType</span> <span class='hs-varid'>env</span> <span class='hs-varid'>ty</span><span class='hs-layout'>}</span>
<a name="line-45"></a><span class='hs-definition'>tidyInst</span> <span class='hs-varid'>env</span> <span class='hs-varid'>dict</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyPred</span> <span class='hs-varid'>env</span> <span class='hs-varid'>pred</span><span class='hs-layout'>}</span>
<a name="line-46"></a><span class='hs-definition'>tidyInst</span> <span class='hs-varid'>env</span> <span class='hs-varid'>meth</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>meth</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyTypes</span> <span class='hs-varid'>env</span> <span class='hs-varid'>tys</span><span class='hs-layout'>}</span>
<a name="line-47"></a><span class='hs-definition'>tidyInst</span> <span class='hs-varid'>env</span> <span class='hs-varid'>implic</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-48"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>implic</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tvs'</span> 
<a name="line-49"></a>	   <span class='hs-layout'>,</span> <span class='hs-varid'>tci_given</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidyInst</span> <span class='hs-varid'>env'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_given</span>  <span class='hs-varid'>implic</span><span class='hs-layout'>)</span>
<a name="line-50"></a>	   <span class='hs-layout'>,</span> <span class='hs-varid'>tci_wanted</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidyInst</span> <span class='hs-varid'>env'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_wanted</span> <span class='hs-varid'>implic</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-51"></a>  <span class='hs-keyword'>where</span>
<a name="line-52"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>env'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tvs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapAccumL</span> <span class='hs-varid'>tidyTyVarBndr</span> <span class='hs-varid'>env</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_tyvars</span> <span class='hs-varid'>implic</span><span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="tidyMoreInsts"></a><span class='hs-definition'>tidyMoreInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TidyEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TidyEnv</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-comment'>-- This function doesn't assume that the tyvars are in scope</span>
<a name="line-56"></a><span class='hs-comment'>-- so it works like tidyOpenType, returning a TidyEnv</span>
<a name="line-57"></a><span class='hs-definition'>tidyMoreInsts</span> <span class='hs-varid'>env</span> <span class='hs-varid'>insts</span>
<a name="line-58"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>env'</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidyInst</span> <span class='hs-varid'>env'</span><span class='hs-layout'>)</span> <span class='hs-varid'>insts</span><span class='hs-layout'>)</span>
<a name="line-59"></a>  <span class='hs-keyword'>where</span>
<a name="line-60"></a>    <span class='hs-varid'>env'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyFreeTyVars</span> <span class='hs-varid'>env</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyVarsOfInsts</span> <span class='hs-varid'>insts</span><span class='hs-layout'>)</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="tidyInsts"></a><span class='hs-definition'>tidyInsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TidyEnv</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-63"></a><span class='hs-definition'>tidyInsts</span> <span class='hs-varid'>insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyMoreInsts</span> <span class='hs-varid'>emptyTidyEnv</span> <span class='hs-varid'>insts</span>
<a name="line-64"></a>
<a name="line-65"></a><a name="showLIE"></a><span class='hs-definition'>showLIE</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>	<span class='hs-comment'>-- Debugging</span>
<a name="line-66"></a><span class='hs-definition'>showLIE</span> <span class='hs-varid'>str</span>
<a name="line-67"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>lie_var</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIEVar</span> <span class='hs-layout'>;</span>
<a name="line-68"></a>	 <span class='hs-varid'>lie</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readMutVar</span> <span class='hs-varid'>lie_var</span> <span class='hs-layout'>;</span>
<a name="line-69"></a>	 <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>str</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>pprInstInFull</span> <span class='hs-layout'>(</span><span class='hs-varid'>lieToList</span> <span class='hs-varid'>lie</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}


%************************************************************************
%*									*
	Extending the instance environment
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcExtendLocalInstEnv"></a><span class='hs-definition'>tcExtendLocalInstEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span>
<a name="line-2"></a>  <span class='hs-comment'>-- Add new locally-defined instances</span>
<a name="line-3"></a><span class='hs-definition'>tcExtendLocalInstEnv</span> <span class='hs-varid'>dfuns</span> <span class='hs-varid'>thing_inside</span>
<a name="line-4"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>traceDFuns</span> <span class='hs-varid'>dfuns</span>
<a name="line-5"></a>      <span class='hs-layout'>;</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span>
<a name="line-6"></a>      <span class='hs-layout'>;</span> <span class='hs-varid'>inst_env'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>foldlM</span> <span class='hs-varid'>addLocalInst</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_inst_env</span> <span class='hs-varid'>env</span><span class='hs-layout'>)</span> <span class='hs-varid'>dfuns</span>
<a name="line-7"></a>      <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>env'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>env</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcg_insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dfuns</span> <span class='hs-varop'>++</span> <span class='hs-varid'>tcg_insts</span> <span class='hs-varid'>env</span><span class='hs-layout'>,</span>
<a name="line-8"></a>			 <span class='hs-varid'>tcg_inst_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inst_env'</span> <span class='hs-layout'>}</span>
<a name="line-9"></a>      <span class='hs-layout'>;</span> <span class='hs-varid'>setGblEnv</span> <span class='hs-varid'>env'</span> <span class='hs-varid'>thing_inside</span> <span class='hs-layout'>}</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="addLocalInst"></a><span class='hs-definition'>addLocalInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>InstEnv</span>
<a name="line-12"></a><span class='hs-comment'>-- Check that the proposed new instance is OK, </span>
<a name="line-13"></a><span class='hs-comment'>-- and then add it to the home inst env</span>
<a name="line-14"></a><span class='hs-definition'>addLocalInst</span> <span class='hs-varid'>home_ie</span> <span class='hs-varid'>ispec</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Instantiate the dfun type so that we extend the instance</span>
<a name="line-16"></a>		<span class='hs-comment'>-- envt with completely fresh template variables</span>
<a name="line-17"></a>		<span class='hs-comment'>-- This is important because the template variables must</span>
<a name="line-18"></a>		<span class='hs-comment'>-- not overlap with anything in the things being looked up</span>
<a name="line-19"></a>		<span class='hs-comment'>-- (since we do unification).  </span>
<a name="line-20"></a>		<span class='hs-comment'>-- We use tcInstSkolType because we don't want to allocate fresh</span>
<a name="line-21"></a>		<span class='hs-comment'>--  *meta* type variables.  </span>
<a name="line-22"></a>	  <span class='hs-keyword'>let</span> <span class='hs-varid'>dfun</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instanceDFunId</span> <span class='hs-varid'>ispec</span>
<a name="line-23"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs'</span><span class='hs-layout'>,</span> <span class='hs-varid'>theta'</span><span class='hs-layout'>,</span> <span class='hs-varid'>tau'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInstSkolType</span> <span class='hs-conid'>InstSkol</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>dfun</span><span class='hs-layout'>)</span>
<a name="line-24"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span>	<span class='hs-layout'>(</span><span class='hs-varid'>cls</span><span class='hs-layout'>,</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitDFunHead</span> <span class='hs-varid'>tau'</span>
<a name="line-25"></a>		<span class='hs-varid'>dfun'</span> 	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setIdType</span> <span class='hs-varid'>dfun</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSigmaTy</span> <span class='hs-varid'>tvs'</span> <span class='hs-varid'>theta'</span> <span class='hs-varid'>tau'</span><span class='hs-layout'>)</span>	    
<a name="line-26"></a>	  	<span class='hs-varid'>ispec'</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setInstanceDFunId</span> <span class='hs-varid'>ispec</span> <span class='hs-varid'>dfun'</span>
<a name="line-27"></a>
<a name="line-28"></a>		<span class='hs-comment'>-- Load imported instances, so that we report</span>
<a name="line-29"></a>		<span class='hs-comment'>-- duplicates correctly</span>
<a name="line-30"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEps</span>
<a name="line-31"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>inst_envs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_inst_env</span> <span class='hs-varid'>eps</span><span class='hs-layout'>,</span> <span class='hs-varid'>home_ie</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a>		<span class='hs-comment'>-- Check functional dependencies</span>
<a name="line-34"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>checkFunDeps</span> <span class='hs-varid'>inst_envs</span> <span class='hs-varid'>ispec'</span> <span class='hs-keyword'>of</span>
<a name="line-35"></a>		<span class='hs-conid'>Just</span> <span class='hs-varid'>specs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>funDepErr</span> <span class='hs-varid'>ispec'</span> <span class='hs-varid'>specs</span>
<a name="line-36"></a>		<span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-37"></a>
<a name="line-38"></a>		<span class='hs-comment'>-- Check for duplicate instance decls</span>
<a name="line-39"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>matches</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupInstEnv</span> <span class='hs-varid'>inst_envs</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>tys'</span>
<a name="line-40"></a>	      <span class='hs-layout'>;</span>	<span class='hs-varid'>dup_ispecs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>dup_ispec</span> 
<a name="line-41"></a>			     <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>dup_ispec</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>matches</span>
<a name="line-42"></a>			     <span class='hs-layout'>,</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>dup_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instanceHead</span> <span class='hs-varid'>dup_ispec</span>
<a name="line-43"></a>			     <span class='hs-layout'>,</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcMatchTys</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarSet</span> <span class='hs-varid'>tvs'</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys'</span> <span class='hs-varid'>dup_tys</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>}</span>
<a name="line-44"></a>		<span class='hs-comment'>-- Find memebers of the match list which ispec itself matches.</span>
<a name="line-45"></a>		<span class='hs-comment'>-- If the match is 2-way, it's a duplicate</span>
<a name="line-46"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>dup_ispecs</span> <span class='hs-keyword'>of</span>
<a name="line-47"></a>	    <span class='hs-varid'>dup_ispec</span> <span class='hs-conop'>:</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>dupInstErr</span> <span class='hs-varid'>ispec'</span> <span class='hs-varid'>dup_ispec</span>
<a name="line-48"></a>	    <span class='hs-conid'>[]</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-49"></a>
<a name="line-50"></a>		<span class='hs-comment'>-- OK, now extend the envt</span>
<a name="line-51"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>extendInstEnv</span> <span class='hs-varid'>home_ie</span> <span class='hs-varid'>ispec'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="getOverlapFlag"></a><span class='hs-definition'>getOverlapFlag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>OverlapFlag</span>
<a name="line-54"></a><span class='hs-definition'>getOverlapFlag</span> 
<a name="line-55"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDOpts</span>
<a name="line-56"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>overlap_ok</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dopt</span> <span class='hs-conid'>Opt_OverlappingInstances</span> <span class='hs-varid'>dflags</span>
<a name="line-57"></a>	      <span class='hs-varid'>incoherent_ok</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dopt</span> <span class='hs-conid'>Opt_IncoherentInstances</span>  <span class='hs-varid'>dflags</span>
<a name="line-58"></a>	      <span class='hs-varid'>overlap_flag</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>incoherent_ok</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Incoherent</span>
<a name="line-59"></a>			   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>overlap_ok</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OverlapOk</span>
<a name="line-60"></a>			   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoOverlap</span>
<a name="line-61"></a>			   
<a name="line-62"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>overlap_flag</span> <span class='hs-layout'>}</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="traceDFuns"></a><span class='hs-definition'>traceDFuns</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>()</span>
<a name="line-65"></a><span class='hs-definition'>traceDFuns</span> <span class='hs-varid'>ispecs</span>
<a name="line-66"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Adding instances:"</span><span class='hs-layout'>)</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>pp</span> <span class='hs-varid'>ispecs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-67"></a>  <span class='hs-keyword'>where</span>
<a name="line-68"></a>    <span class='hs-varid'>pp</span> <span class='hs-varid'>ispec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>instanceDFunId</span> <span class='hs-varid'>ispec</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>colon</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ispec</span>
<a name="line-69"></a>	<span class='hs-comment'>-- Print the dfun name itself too</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="funDepErr"></a><span class='hs-definition'>funDepErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>()</span>
<a name="line-72"></a><span class='hs-definition'>funDepErr</span> <span class='hs-varid'>ispec</span> <span class='hs-varid'>ispecs</span>
<a name="line-73"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addDictLoc</span> <span class='hs-varid'>ispec</span> <span class='hs-varop'>$</span>
<a name="line-74"></a>    <span class='hs-varid'>addErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Functional dependencies conflict between instance declarations:"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-75"></a>	       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprInstances</span> <span class='hs-layout'>(</span><span class='hs-varid'>ispec</span><span class='hs-conop'>:</span><span class='hs-varid'>ispecs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-76"></a><a name="dupInstErr"></a><span class='hs-definition'>dupInstErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>()</span>
<a name="line-77"></a><span class='hs-definition'>dupInstErr</span> <span class='hs-varid'>ispec</span> <span class='hs-varid'>dup_ispec</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addDictLoc</span> <span class='hs-varid'>ispec</span> <span class='hs-varop'>$</span>
<a name="line-79"></a>    <span class='hs-varid'>addErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Duplicate instance declarations:"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-80"></a>	       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprInstances</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ispec</span><span class='hs-layout'>,</span> <span class='hs-varid'>dup_ispec</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="addDictLoc"></a><span class='hs-definition'>addDictLoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-varid'>a</span>
<a name="line-83"></a><span class='hs-definition'>addDictLoc</span> <span class='hs-varid'>ispec</span> <span class='hs-varid'>thing_inside</span>
<a name="line-84"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSrcSpan</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>loc</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing_inside</span>
<a name="line-85"></a>  <span class='hs-keyword'>where</span>
<a name="line-86"></a>   <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getSrcLoc</span> <span class='hs-varid'>ispec</span>
</pre>\end{code}
    

%************************************************************************
%*									*
\subsection{Looking up Insts}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="LookupInstResult"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LookupInstResult</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoInstance</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>GenInst</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- The expression and its needed insts</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="lookupSimpleInst"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>LookupInstResult</span>
<a name="line-6"></a><span class='hs-comment'>-- This is "simple" in that it returns NoInstance for implication constraints</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-comment'>-- It's important that lookupInst does not put any new stuff into</span>
<a name="line-9"></a><span class='hs-comment'>-- the LIE.  Instead, any Insts needed by the lookup are returned in</span>
<a name="line-10"></a><span class='hs-comment'>-- the LookupInstResult, where they can be further processed by tcSimplify</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</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'>return</span> <span class='hs-conid'>NoInstance</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-comment'>--------------------- Implications ------------------------</span>
<a name="line-15"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImplicInst</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'>return</span> <span class='hs-conid'>NoInstance</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-comment'>--------------------- Methods ------------------------</span>
<a name="line-18"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Method</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_oid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>theta</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loc</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-19"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>dict_app</span><span class='hs-layout'>,</span> <span class='hs-varid'>dicts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIE</span> <span class='hs-varop'>$</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>theta</span>
<a name="line-20"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>co_fn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dict_app</span> <span class='hs-varop'>&lt;.&gt;</span> <span class='hs-varid'>mkWpTyApps</span> <span class='hs-varid'>tys</span>
<a name="line-21"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenInst</span> <span class='hs-varid'>dicts</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varop'>$</span> <span class='hs-conid'>HsWrap</span> <span class='hs-varid'>co_fn</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsVar</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-layout'>}</span>
<a name="line-22"></a>  <span class='hs-keyword'>where</span>
<a name="line-23"></a>    <span class='hs-varid'>span</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instLocSpan</span> <span class='hs-varid'>loc</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-comment'>--------------------- Literals ------------------------</span>
<a name="line-26"></a><span class='hs-comment'>-- Look for short cuts first: if the literal is *definitely* a </span>
<a name="line-27"></a><span class='hs-comment'>-- int, integer, float or a double, generate the real thing here.</span>
<a name="line-28"></a><span class='hs-comment'>-- This is essential (see nofib/spectral/nucleic).</span>
<a name="line-29"></a><span class='hs-comment'>-- [Same shortcut as in newOverloadedLit, but we</span>
<a name="line-30"></a><span class='hs-comment'>--  may have done some unification by now] 		</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>LitInst</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>OverLit</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ol_val</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit_val</span>
<a name="line-33"></a>					          <span class='hs-layout'>,</span> <span class='hs-varid'>ol_rebindable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rebindable</span> <span class='hs-layout'>}</span>
<a name="line-34"></a>			  <span class='hs-layout'>,</span> <span class='hs-varid'>tci_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>iloc</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-35"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>debugIsOn</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>rebindable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"lookupSimpleInst"</span> <span class='hs-comment'>-- A LitInst invariant</span>
<a name="line-36"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>witness</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>shortCutLit</span> <span class='hs-varid'>lit_val</span> <span class='hs-varid'>ty</span>
<a name="line-37"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>lit'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ol_witness</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>witness</span><span class='hs-layout'>,</span> <span class='hs-varid'>ol_type</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span>
<a name="line-38"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenInst</span> <span class='hs-conid'>[]</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'>HsOverLit</span> <span class='hs-varid'>lit'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-39"></a>
<a name="line-40"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-41"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>hs_lit</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mkOverLit</span> <span class='hs-varid'>lit_val</span>
<a name="line-42"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>from_thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupId</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsOverLitName</span> <span class='hs-varid'>lit_val</span><span class='hs-layout'>)</span>
<a name="line-43"></a>		  <span class='hs-comment'>-- Not rebindable, so hsOverLitName is the right thing</span>
<a name="line-44"></a>    	<span class='hs-layout'>;</span> <span class='hs-varid'>method_inst</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInstClassOp</span> <span class='hs-varid'>iloc</span> <span class='hs-varid'>from_thing</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span>
<a name="line-45"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>witness</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsApp</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'>HsVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>instToId</span> <span class='hs-varid'>method_inst</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-46"></a>			      <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'>HsLit</span> <span class='hs-varid'>hs_lit</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-47"></a>	      <span class='hs-varid'>lit'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lit</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ol_witness</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>witness</span><span class='hs-layout'>,</span> <span class='hs-varid'>ol_type</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span>
<a name="line-48"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenInst</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>method_inst</span><span class='hs-keyglyph'>]</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'>HsOverLit</span> <span class='hs-varid'>lit'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-49"></a>  <span class='hs-keyword'>where</span>
<a name="line-50"></a>    <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instLocSpan</span> <span class='hs-varid'>iloc</span>
<a name="line-51"></a>
<a name="line-52"></a><span class='hs-comment'>--------------------- Dictionaries ------------------------</span>
<a name="line-53"></a><span class='hs-definition'>lookupSimpleInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dict</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pred</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loc</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-54"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>mb_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupPred</span> <span class='hs-varid'>pred</span>
<a name="line-55"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_result</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-56"></a>	    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>NoInstance</span> <span class='hs-layout'>;</span>
<a name="line-57"></a>	    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>dfun_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>mb_inst_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-58"></a>
<a name="line-59"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>use_stage</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getStage</span>
<a name="line-60"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>checkWellStaged</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"instance for"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-61"></a>    		      <span class='hs-layout'>(</span><span class='hs-varid'>topIdLvl</span> <span class='hs-varid'>dfun_id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>thLevel</span> <span class='hs-varid'>use_stage</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a> 	<span class='hs-comment'>-- It's possible that not all the tyvars are in</span>
<a name="line-64"></a>	<span class='hs-comment'>-- the substitution, tenv. For example:</span>
<a name="line-65"></a>	<span class='hs-comment'>--	instance C X a =&gt; D X where ...</span>
<a name="line-66"></a>	<span class='hs-comment'>-- (presumably there's a functional dependency in class C)</span>
<a name="line-67"></a>	<span class='hs-comment'>-- Hence mb_inst_tys :: Either TyVar TcType </span>
<a name="line-68"></a>
<a name="line-69"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>inst_tv</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tv'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInstTyVar</span> <span class='hs-varid'>tv</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>tv'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-70"></a>	  <span class='hs-varid'>inst_tv</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ty</span>
<a name="line-71"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>inst_tv</span> <span class='hs-varid'>mb_inst_tys</span>
<a name="line-72"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span>
<a name="line-73"></a>    	<span class='hs-layout'>(</span><span class='hs-varid'>theta</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitPhiTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>applyTys</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>dfun_id</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-74"></a>	<span class='hs-varid'>src_loc</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>instLocSpan</span> <span class='hs-varid'>loc</span>
<a name="line-75"></a>	<span class='hs-varid'>dfun</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsVar</span> <span class='hs-varid'>dfun_id</span>
<a name="line-76"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>theta</span> <span class='hs-keyword'>then</span>
<a name="line-77"></a>        <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenInst</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>src_loc</span> <span class='hs-varop'>$</span> <span class='hs-conid'>HsWrap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkWpTyApps</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-varid'>dfun</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-78"></a>      <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-79"></a>    <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>dict_app</span><span class='hs-layout'>,</span> <span class='hs-varid'>dicts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIE</span> <span class='hs-varop'>$</span> <span class='hs-varid'>instCallDicts</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>theta</span> <span class='hs-comment'>-- !!!</span>
<a name="line-80"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>co_fn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dict_app</span> <span class='hs-varop'>&lt;.&gt;</span> <span class='hs-varid'>mkWpTyApps</span> <span class='hs-varid'>tys</span>
<a name="line-81"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenInst</span> <span class='hs-varid'>dicts</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>src_loc</span> <span class='hs-varop'>$</span> <span class='hs-conid'>HsWrap</span> <span class='hs-varid'>co_fn</span> <span class='hs-varid'>dfun</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-82"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="lookupPred"></a><span class='hs-comment'>---------------</span>
<a name="line-85"></a><span class='hs-definition'>lookupPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>DFunId</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Either</span> <span class='hs-conid'>TyVar</span> <span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-86"></a><span class='hs-comment'>-- Look up a class constraint in the instance environment</span>
<a name="line-87"></a><span class='hs-definition'>lookupPred</span> <span class='hs-varid'>pred</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ClassP</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-88"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>eps</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEps</span>
<a name="line-89"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcg_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span>
<a name="line-90"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>inst_envs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_inst_env</span> <span class='hs-varid'>eps</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcg_inst_env</span> <span class='hs-varid'>tcg_env</span><span class='hs-layout'>)</span>
<a name="line-91"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupInstEnv</span> <span class='hs-varid'>inst_envs</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>tys</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-92"></a>	    <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>ispec</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-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> 
<a name="line-93"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>dfun_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>is_dfun</span> <span class='hs-varid'>ispec</span>
<a name="line-94"></a>			<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"lookupInst success"</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-95"></a>				   <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"dict"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>,</span> 
<a name="line-96"></a>				         <span class='hs-varid'>text</span> <span class='hs-str'>"witness"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>dfun_id</span>
<a name="line-97"></a>					 <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>dfun_id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-98"></a>				<span class='hs-comment'>-- Record that this dfun is needed</span>
<a name="line-99"></a>			<span class='hs-layout'>;</span> <span class='hs-varid'>record_dfun_usage</span> <span class='hs-varid'>dfun_id</span>
<a name="line-100"></a>			<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>dfun_id</span><span class='hs-layout'>,</span> <span class='hs-varid'>inst_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> <span class='hs-layout'>;</span>
<a name="line-101"></a>
<a name="line-102"></a>     	    <span class='hs-layout'>(</span><span class='hs-varid'>matches</span><span class='hs-layout'>,</span> <span class='hs-varid'>unifs</span><span class='hs-layout'>)</span>
<a name="line-103"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"lookupInst fail"</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-104"></a>				   <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"dict"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>,</span>
<a name="line-105"></a>				   	 <span class='hs-varid'>text</span> <span class='hs-str'>"matches"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>matches</span><span class='hs-layout'>,</span>
<a name="line-106"></a>				   	 <span class='hs-varid'>text</span> <span class='hs-str'>"unifs"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>unifs</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-107"></a>		<span class='hs-comment'>-- In the case of overlap (multiple matches) we report</span>
<a name="line-108"></a>		<span class='hs-comment'>-- NoInstance here.  That has the effect of making the </span>
<a name="line-109"></a>		<span class='hs-comment'>-- context-simplifier return the dict as an irreducible one.</span>
<a name="line-110"></a>		<span class='hs-comment'>-- Then it'll be given to addNoInstanceErrs, which will do another</span>
<a name="line-111"></a>		<span class='hs-comment'>-- lookupInstEnv to get the detailed info about what went wrong.</span>
<a name="line-112"></a>			<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span> <span class='hs-layout'>}</span>
<a name="line-113"></a>	<span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-114"></a>
<a name="line-115"></a><span class='hs-definition'>lookupPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>IParam</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'>return</span> <span class='hs-conid'>Nothing</span>	<span class='hs-comment'>-- Implicit parameters</span>
<a name="line-116"></a><span class='hs-definition'>lookupPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</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'>panic</span> <span class='hs-str'>"lookupPred EqPred"</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="record_dfun_usage"></a><span class='hs-definition'>record_dfun_usage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-conid'>()</span>
<a name="line-119"></a><span class='hs-definition'>record_dfun_usage</span> <span class='hs-varid'>dfun_id</span> 
<a name="line-120"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getTopEnv</span>
<a name="line-121"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span>  <span class='hs-varid'>dfun_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>dfun_id</span>
<a name="line-122"></a>	       <span class='hs-varid'>dfun_mod</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>dfun_name</span> <span class='hs-layout'>)</span> 
<a name="line-123"></a>	         	   <span class='hs-varid'>nameModule</span> <span class='hs-varid'>dfun_name</span>
<a name="line-124"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isInternalName</span> <span class='hs-varid'>dfun_name</span> <span class='hs-varop'>||</span>    <span class='hs-comment'>-- Internal name =&gt; defined in this module</span>
<a name="line-125"></a>	     <span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>dfun_mod</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>thisPackage</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_dflags</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span>
<a name="line-126"></a>	  <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span> <span class='hs-comment'>-- internal, or in another package</span>
<a name="line-127"></a>	   <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tcg_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span>
<a name="line-128"></a>	  	   <span class='hs-layout'>;</span> <span class='hs-varid'>updMutVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_inst_uses</span> <span class='hs-varid'>tcg_env</span><span class='hs-layout'>)</span>
<a name="line-129"></a>			       <span class='hs-layout'>(</span><span class='hs-varop'>`addOneToNameSet`</span> <span class='hs-varid'>idName</span> <span class='hs-varid'>dfun_id</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-130"></a>
<a name="line-131"></a>
<a name="line-132"></a><a name="tcGetInstEnvs"></a><span class='hs-definition'>tcGetInstEnvs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>InstEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>InstEnv</span><span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-comment'>-- Gets both the external-package inst-env</span>
<a name="line-134"></a><span class='hs-comment'>-- and the home-pkg inst env (includes module being compiled)</span>
<a name="line-135"></a><span class='hs-definition'>tcGetInstEnvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEps</span><span class='hs-layout'>;</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getGblEnv</span><span class='hs-layout'>;</span>
<a name="line-136"></a>		     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_inst_env</span> <span class='hs-varid'>eps</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcg_inst_env</span> <span class='hs-varid'>env</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}



%************************************************************************
%*									*
		Re-mappable syntax
%*									*
%************************************************************************

Suppose we are doing the -XNoImplicitPrelude thing, and we encounter
a do-expression.  We have to find (>>) in the current environment, which is
done by the rename. Then we have to check that it has the same type as
Control.Monad.(>>).  Or, more precisely, a compatible type. One 'customer' had
this:

  (>>) :: HB m n mn => m a -> n b -> mn b

So the idea is to generate a local binding for (>>), thus:

	let then72 :: forall a b. m a -> m b -> m b
	    then72 = ...something involving the user's (>>)...
	in
	...the do-expression...

Now the do-expression can proceed using then72, which has exactly
the expected type.

In fact tcSyntaxName just generates the RHS for then72, because we only
want an actual binding in the do-expression case. For literals, we can 
just use the expression inline.

\begin{code}
<pre><a name="line-1"></a><a name="tcSyntaxName"></a><span class='hs-definition'>tcSyntaxName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstOrigin</span>
<a name="line-2"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcType</span>			<span class='hs-comment'>-- Type to instantiate it at</span>
<a name="line-3"></a>	     <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-conid'>HsExpr</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- (Standard name, user name)</span>
<a name="line-4"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsExpr</span> <span class='hs-conid'>TcId</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- (Standard name, suitable expression)</span>
<a name="line-5"></a><span class='hs-comment'>--	*** NOW USED ONLY FOR CmdTop (sigh) ***</span>
<a name="line-6"></a><span class='hs-comment'>-- NB: tcSyntaxName calls tcExpr, and hence can do unification.</span>
<a name="line-7"></a><span class='hs-comment'>-- So we do not call it from lookupInst, which is called from tcSimplify</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-definition'>tcSyntaxName</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>std_nm</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsVar</span> <span class='hs-varid'>user_nm</span><span class='hs-layout'>)</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>std_nm</span> <span class='hs-varop'>==</span> <span class='hs-varid'>user_nm</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMethodFromName</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>std_nm</span>
<a name="line-12"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>std_nm</span><span class='hs-layout'>,</span> <span class='hs-conid'>HsVar</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-definition'>tcSyntaxName</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>std_nm</span><span class='hs-layout'>,</span> <span class='hs-varid'>user_nm_expr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-15"></a>    <span class='hs-varid'>std_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupId</span> <span class='hs-varid'>std_nm</span>
<a name="line-16"></a>    <span class='hs-keyword'>let</span>	
<a name="line-17"></a>	<span class='hs-comment'>-- C.f. newMethodAtLoc</span>
<a name="line-18"></a>	<span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>tv</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>tau</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitSigmaTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>std_id</span><span class='hs-layout'>)</span>
<a name="line-19"></a> 	<span class='hs-varid'>sigma1</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>substTyWith</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tv</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>tau</span>
<a name="line-20"></a>	<span class='hs-comment'>-- Actually, the "tau-type" might be a sigma-type in the</span>
<a name="line-21"></a>	<span class='hs-comment'>-- case of locally-polymorphic methods.</span>
<a name="line-22"></a>
<a name="line-23"></a>    <span class='hs-varid'>addErrCtxtM</span> <span class='hs-layout'>(</span><span class='hs-varid'>syntaxNameCtxt</span> <span class='hs-varid'>user_nm_expr</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>sigma1</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-comment'>-- Check that the user-supplied thing has the</span>
<a name="line-26"></a>	<span class='hs-comment'>-- same type as the standard one.  </span>
<a name="line-27"></a>	<span class='hs-comment'>-- Tiresome jiggling because tcCheckSigma takes a located expression</span>
<a name="line-28"></a>     <span class='hs-varid'>span</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-29"></a>     <span class='hs-varid'>expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcPolyExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>user_nm_expr</span><span class='hs-layout'>)</span> <span class='hs-varid'>sigma1</span>
<a name="line-30"></a>     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>std_nm</span><span class='hs-layout'>,</span> <span class='hs-varid'>unLoc</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="syntaxNameCtxt"></a><span class='hs-definition'>syntaxNameCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TidyEnv</span>
<a name="line-33"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcRn</span> <span class='hs-layout'>(</span><span class='hs-conid'>TidyEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>SDoc</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-definition'>syntaxNameCtxt</span> <span class='hs-varid'>name</span> <span class='hs-varid'>orig</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>tidy_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-35"></a>    <span class='hs-varid'>inst_loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInstLoc</span> <span class='hs-varid'>orig</span>
<a name="line-36"></a>    <span class='hs-keyword'>let</span>
<a name="line-37"></a>	<span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"When checking that"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-38"></a>				<span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"(needed by a syntactic construct)"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-39"></a>		    <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"has the required type:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidyType</span> <span class='hs-varid'>tidy_env</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-40"></a>		    <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"arising from"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>pprInstLoc</span> <span class='hs-varid'>inst_loc</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-41"></a>    
<a name="line-42"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tidy_env</span><span class='hs-layout'>,</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
		EqInsts
%*									*
%************************************************************************

Operations on EqInstCo.

\begin{code}
<pre><a name="line-1"></a><a name="mkGivenCo"></a><span class='hs-definition'>mkGivenCo</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Coercion</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-2"></a><span class='hs-definition'>mkGivenCo</span>   <span class='hs-keyglyph'>=</span>  <span class='hs-conid'>Right</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="mkWantedCo"></a><span class='hs-definition'>mkWantedCo</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcTyVar</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-5"></a><span class='hs-definition'>mkWantedCo</span>  <span class='hs-keyglyph'>=</span>  <span class='hs-conid'>Left</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="isWantedCo"></a><span class='hs-definition'>isWantedCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-8"></a><span class='hs-definition'>isWantedCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</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-9"></a><span class='hs-definition'>isWantedCo</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="eqInstCoType"></a><span class='hs-definition'>eqInstCoType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcType</span>
<a name="line-12"></a><span class='hs-definition'>eqInstCoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>cotv</span>
<a name="line-13"></a><span class='hs-definition'>eqInstCoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co</span>
</pre>\end{code}

Coercion transformations on EqInstCo.  These transformations work differently
depending on whether a EqInstCo is for a wanted or local equality:

  Local : apply the inverse of the specified coercion
  Wanted: obtain a fresh coercion hole (meta tyvar) and update the old hole
          to be the specified coercion applied to the new coercion hole

\begin{code}
<pre><a name="line-1"></a><a name="mkIdEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = id</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-definition'>mkIdEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-4"></a><span class='hs-definition'>mkIdEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-varid'>t</span>
<a name="line-6"></a><span class='hs-definition'>mkIdEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="mkSymEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = sym co'</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-definition'>mkSymEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-12"></a><span class='hs-definition'>mkSymEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-14"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSymCoercion</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-15"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv'</span>
<a name="line-16"></a>       <span class='hs-layout'>}</span>
<a name="line-17"></a><span class='hs-definition'>mkSymEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> 
<a name="line-18"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSymCoercion</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="mkLeftTransEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = co' |&gt; given_co</span>
<a name="line-21"></a><span class='hs-comment'>--</span>
<a name="line-22"></a><span class='hs-definition'>mkLeftTransEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Coercion</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-23"></a><span class='hs-definition'>mkLeftTransEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-varid'>given_co</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-25"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv'</span> <span class='hs-varop'>`mkTransCoercion`</span> <span class='hs-varid'>given_co</span><span class='hs-layout'>)</span>
<a name="line-26"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv'</span>
<a name="line-27"></a>       <span class='hs-layout'>}</span>
<a name="line-28"></a><span class='hs-definition'>mkLeftTransEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-varid'>given_co</span> <span class='hs-keyword'>_</span> 
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>co</span> <span class='hs-varop'>`mkTransCoercion`</span> <span class='hs-varid'>mkSymCoercion</span> <span class='hs-varid'>given_co</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="mkRightTransEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = given_co |&gt; co'</span>
<a name="line-32"></a><span class='hs-comment'>--</span>
<a name="line-33"></a><span class='hs-definition'>mkRightTransEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Coercion</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-34"></a><span class='hs-definition'>mkRightTransEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-varid'>given_co</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-35"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-36"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-varid'>given_co</span> <span class='hs-varop'>`mkTransCoercion`</span> <span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv'</span><span class='hs-layout'>)</span>
<a name="line-37"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv'</span>
<a name="line-38"></a>       <span class='hs-layout'>}</span>
<a name="line-39"></a><span class='hs-definition'>mkRightTransEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-varid'>given_co</span> <span class='hs-keyword'>_</span> 
<a name="line-40"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSymCoercion</span> <span class='hs-varid'>given_co</span> <span class='hs-varop'>`mkTransCoercion`</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="mkAppEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = col cor</span>
<a name="line-43"></a><span class='hs-comment'>--</span>
<a name="line-44"></a><span class='hs-definition'>mkAppEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-45"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInstCo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EqInstCo</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-definition'>mkAppEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1_l</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2_l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1_r</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2_r</span><span class='hs-layout'>)</span>
<a name="line-47"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv_l</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1_l</span> <span class='hs-varid'>ty2_l</span>
<a name="line-48"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>cotv_r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1_r</span> <span class='hs-varid'>ty2_r</span>
<a name="line-49"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAppCoercion</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv_l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv_r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-50"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv_l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv_r</span><span class='hs-layout'>)</span>
<a name="line-51"></a>       <span class='hs-layout'>}</span>
<a name="line-52"></a><span class='hs-definition'>mkAppEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span>
<a name="line-53"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkLeftCoercion</span> <span class='hs-varid'>co</span><span class='hs-layout'>,</span> <span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkRightCoercion</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><a name="mkTyConEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = con col -&gt; cor</span>
<a name="line-56"></a><span class='hs-comment'>--</span>
<a name="line-57"></a><span class='hs-definition'>mkTyConEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>EqInstCo</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-definition'>mkTyConEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-varid'>con</span> <span class='hs-varid'>ty12s</span>
<a name="line-59"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotvs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-varid'>newMetaCoVar</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty12s</span>
<a name="line-60"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyConCoercion</span> <span class='hs-varid'>con</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTys</span> <span class='hs-varid'>cotvs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-61"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotvs</span><span class='hs-layout'>)</span>
<a name="line-62"></a>       <span class='hs-layout'>}</span>
<a name="line-63"></a><span class='hs-definition'>mkTyConEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>args</span>
<a name="line-64"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>mkCoes</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-varop'>.</span><span class='hs-layout'>)</span> <span class='hs-varid'>id</span> <span class='hs-varid'>mkCoes</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-varid'>mkCoes</span>
<a name="line-65"></a>    <span class='hs-comment'>-- make cascades of the form </span>
<a name="line-66"></a>    <span class='hs-comment'>--   mkRightCoercion (mkLeftCoercion .. (mkLeftCoercion co)..)</span>
<a name="line-67"></a>  <span class='hs-keyword'>where</span>
<a name="line-68"></a>    <span class='hs-varid'>n</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>args</span>
<a name="line-69"></a>    <span class='hs-varid'>mkCoes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkRightCoercion</span> <span class='hs-conop'>:</span> <span class='hs-varid'>replicate</span> <span class='hs-varid'>i</span> <span class='hs-varid'>mkLeftCoercion</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>2</span><span class='hs-keyglyph'>..</span><span class='hs-num'>0</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="mkFunEqInstCo"></a><span class='hs-comment'>-- Coercion transformation: co = col -&gt; cor</span>
<a name="line-72"></a><span class='hs-comment'>--</span>
<a name="line-73"></a><span class='hs-definition'>mkFunEqInstCo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Type</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-74"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInstCo</span><span class='hs-layout'>,</span> <span class='hs-conid'>EqInstCo</span><span class='hs-layout'>)</span>
<a name="line-75"></a><span class='hs-definition'>mkFunEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1_l</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2_l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1_r</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty2_r</span><span class='hs-layout'>)</span>
<a name="line-76"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv_l</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1_l</span> <span class='hs-varid'>ty2_l</span>
<a name="line-77"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>cotv_r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1_r</span> <span class='hs-varid'>ty2_r</span>
<a name="line-78"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>bindMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFunCoercion</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv_l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>cotv_r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-79"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv_l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv_r</span><span class='hs-layout'>)</span>
<a name="line-80"></a>       <span class='hs-layout'>}</span>
<a name="line-81"></a><span class='hs-definition'>mkFunEqInstCo</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span>
<a name="line-82"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkRightCoercion</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkLeftCoercion</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-83"></a>            <span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkRightCoercion</span> <span class='hs-varid'>co</span><span class='hs-layout'>)</span>
</pre>\end{code}

Operations on entire EqInst.

\begin{code}
<pre><a name="line-1"></a><a name="wantedEqInstIsUnsolved"></a><span class='hs-comment'>-- |A wanted equality is unsolved as long as its cotv is unfilled.</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-definition'>wantedEqInstIsUnsolved</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Bool</span>
<a name="line-4"></a><span class='hs-definition'>wantedEqInstIsUnsolved</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>isFilledMetaTyVar</span> <span class='hs-varid'>cotv</span>
<a name="line-6"></a><span class='hs-definition'>wantedEqInstIsUnsolved</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="eitherEqInst"></a><span class='hs-definition'>eitherEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> 	            <span class='hs-comment'>-- given or wanted EqInst</span>
<a name="line-9"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TcTyVar</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>     <span class='hs-comment'>-- 	result if wanted</span>
<a name="line-10"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Coercion</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>     <span class='hs-comment'>--	result if given</span>
<a name="line-11"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>		
<a name="line-12"></a><span class='hs-definition'>eitherEqInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>either_co</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>withWanted</span> <span class='hs-varid'>withGiven</span>
<a name="line-13"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>either_co</span> <span class='hs-keyword'>of</span>
<a name="line-14"></a>		<span class='hs-conid'>Left</span>  <span class='hs-varid'>covar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>withWanted</span> <span class='hs-varid'>covar</span>
<a name="line-15"></a>		<span class='hs-conid'>Right</span> <span class='hs-varid'>co</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>withGiven</span>  <span class='hs-varid'>co</span>
<a name="line-16"></a><span class='hs-definition'>eitherEqInst</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"eitherEqInst"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="mkEqInst"></a><span class='hs-definition'>mkEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-19"></a><span class='hs-definition'>mkEqInst</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-varid'>co</span>
<a name="line-20"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>uniq</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span>
<a name="line-21"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>src_span</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-22"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>err_ctxt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getErrCtxt</span>
<a name="line-23"></a>	     <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>loc</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InstLoc</span> <span class='hs-conid'>EqOrigin</span> <span class='hs-varid'>src_span</span> <span class='hs-varid'>err_ctxt</span>
<a name="line-24"></a>	           <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>src_span</span>
<a name="line-25"></a>	           <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span>
<a name="line-26"></a>                                 <span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span>
<a name="line-27"></a>                                 <span class='hs-layout'>,</span> <span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>co</span>
<a name="line-28"></a>                                 <span class='hs-layout'>,</span> <span class='hs-varid'>tci_loc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loc</span>
<a name="line-29"></a>                                 <span class='hs-layout'>,</span> <span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span>
<a name="line-30"></a>                                 <span class='hs-layout'>}</span> 
<a name="line-31"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>inst</span>
<a name="line-32"></a>	     <span class='hs-layout'>}</span>
<a name="line-33"></a>	<span class='hs-keyword'>where</span> 
<a name="line-34"></a>          <span class='hs-varid'>mkName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>src_span</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkVarOcc</span> <span class='hs-str'>"co_ei"</span><span class='hs-layout'>)</span> <span class='hs-varid'>src_span</span>
<a name="line-35"></a><span class='hs-definition'>mkEqInst</span> <span class='hs-varid'>pred</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"mkEqInst"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="mkWantedEqInst"></a><span class='hs-definition'>mkWantedEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>
<a name="line-38"></a><span class='hs-definition'>mkWantedEqInst</span> <span class='hs-varid'>pred</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-39"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cotv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMetaCoVar</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-40"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>mkEqInst</span> <span class='hs-varid'>pred</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span>
<a name="line-41"></a>       <span class='hs-layout'>}</span>
<a name="line-42"></a><span class='hs-definition'>mkWantedEqInst</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"mkWantedEqInst"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="wantedToLocalEqInst"></a><span class='hs-comment'>-- Turn a wanted equality into a local that propagates the uninstantiated</span>
<a name="line-45"></a><span class='hs-comment'>-- coercion variable as witness.  We need this to propagate wanted irreds into</span>
<a name="line-46"></a><span class='hs-comment'>-- attempts to solve implication constraints.</span>
<a name="line-47"></a><span class='hs-comment'>--</span>
<a name="line-48"></a><span class='hs-definition'>wantedToLocalEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Inst</span>
<a name="line-49"></a><span class='hs-definition'>wantedToLocalEqInst</span> <span class='hs-varid'>eq</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-50"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eq</span> <span class='hs-layout'>{</span><span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
<a name="line-51"></a><span class='hs-definition'>wantedToLocalEqInst</span> <span class='hs-varid'>eq</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eq</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="finalizeEqInst"></a><span class='hs-comment'>-- Turn a wanted into a local EqInst (needed during type inference for</span>
<a name="line-54"></a><span class='hs-comment'>-- signatures) </span>
<a name="line-55"></a><span class='hs-comment'>--</span>
<a name="line-56"></a><span class='hs-comment'>-- * Give it a name and change the coercion around.</span>
<a name="line-57"></a><span class='hs-comment'>--</span>
<a name="line-58"></a><span class='hs-definition'>finalizeEqInst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span>			<span class='hs-comment'>-- wanted</span>
<a name="line-59"></a>	       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Inst</span>		<span class='hs-comment'>-- given</span>
<a name="line-60"></a><span class='hs-definition'>finalizeEqInst</span> <span class='hs-varid'>wanted</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>EqInst</span><span class='hs-layout'>{</span><span class='hs-varid'>tci_left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>,</span> 
<a name="line-61"></a>                              <span class='hs-varid'>tci_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>cotv</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-62"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>var</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Var</span><span class='hs-varop'>.</span><span class='hs-varid'>mkCoVar</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-conid'>PredTy</span> <span class='hs-varop'>$</span> <span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-63"></a>
<a name="line-64"></a>         <span class='hs-comment'>-- fill the coercion hole</span>
<a name="line-65"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>writeMetaTyVar</span> <span class='hs-varid'>cotv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>var</span><span class='hs-layout'>)</span>
<a name="line-66"></a>
<a name="line-67"></a>         <span class='hs-comment'>-- set the new coercion</span>
<a name="line-68"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>given</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wanted</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tci_co</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkGivenCo</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>var</span> <span class='hs-layout'>}</span>
<a name="line-69"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>given</span>
<a name="line-70"></a>       <span class='hs-layout'>}</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-definition'>finalizeEqInst</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"finalizeEqInst"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-73"></a>
<a name="line-74"></a><a name="eqInstType"></a><span class='hs-definition'>eqInstType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcType</span>
<a name="line-75"></a><span class='hs-definition'>eqInstType</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eitherEqInst</span> <span class='hs-varid'>inst</span> <span class='hs-varid'>mkTyVarTy</span> <span class='hs-varid'>id</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="eqInstCoercion"></a><span class='hs-definition'>eqInstCoercion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EqInstCo</span>
<a name="line-78"></a><span class='hs-definition'>eqInstCoercion</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tci_co</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="eqInstTys"></a><span class='hs-definition'>eqInstTys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>TcType</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcType</span><span class='hs-layout'>)</span>
<a name="line-81"></a><span class='hs-definition'>eqInstTys</span> <span class='hs-varid'>inst</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>tci_left</span> <span class='hs-varid'>inst</span><span class='hs-layout'>,</span> <span class='hs-varid'>tci_right</span> <span class='hs-varid'>inst</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>