<?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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'><-</span> <span class='hs-varid'>insts</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'><-</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'><-</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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TyVarSet</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TyVarSet</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'><-</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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-></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'><-</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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></span> <span class='hs-conid'>TcPredType</span> <span class='hs-keyglyph'>-></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'><-</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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'><.></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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></span> <span class='hs-conid'>TcThetaType</span> <span class='hs-keyglyph'>-></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 -> Type -> TcM ([Inst], Coercion)</span> <a name="line-83"></a><span class='hs-comment'>-- ; (dicts, co_fn) <- instCallDicts loc preds</span> <a name="line-84"></a><span class='hs-comment'>-- ; return (dicts, co_fn <.> 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'><+></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'><-</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'><-</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'><.></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'><-</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'><-</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'><.></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'>-></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'><-</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'>-></span> <span class='hs-conid'>IPName</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <a name="line-113"></a> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></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'>-></span> <span class='hs-conid'>InstLoc</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PredType</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>BoxyRhoType</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'><-</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'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcType</span> <span class='hs-keyglyph'>-></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 <- 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'><+></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'><+></span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty1</span> <span class='hs-varop'><+></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 <- 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'>-></span> <span class='hs-conid'>Id</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'><-</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'>-></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'><-</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'><-</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'>-></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'><-</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'><-</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'><-</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'><-</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'><-</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'><-</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'><-</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'><-</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'>-></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'>-></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'><-</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'><-</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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-varid'>text</span> <span class='hs-str'>"Wanted"</span> <span class='hs-varop'><+></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'><+></span> <span class='hs-varid'>dcolon</span> <span class='hs-varop'><+></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'>-></span> <span class='hs-varid'>text</span> <span class='hs-str'>"Given"</span> <span class='hs-varop'><+></span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>co</span> <span class='hs-varop'><+></span> <span class='hs-varid'>dcolon</span> <span class='hs-varop'><+></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'><></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'><+></span> <span class='hs-varid'>dcolon</span> <a name="line-27"></a> <span class='hs-varop'><+></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'><></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'>" &"</span> <span class='hs-varop'><+></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'>-></span> <span class='hs-conid'>Inst</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Inst</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'><-</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'><-</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'><+></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'>-></span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'>-></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'>-></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'><-</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'>-></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'>-></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'><-</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'>-></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'><+></span> <span class='hs-varid'>colon</span> <span class='hs-varop'><+></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'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Instance</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>TcRn</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'><-</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'><.></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'>&&</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'><-</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'><-</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'><-</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'><-</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'><-</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'>-></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'>-></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'><-</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'><+></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 => 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'><-</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'><-</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'><-</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'><.></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'>-></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'><-</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'><-</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'>-></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'><+></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'><+></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'><+></span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>dfun_id</span> <a name="line-97"></a> <span class='hs-varop'><+></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'>-></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'><+></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'><+></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'><+></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'><+></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'>-></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'><-</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 => 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'><-</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'><-</span> <span class='hs-varid'>getEps</span><span class='hs-layout'>;</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'><-</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'>-></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'>-></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'>-></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'><-</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'><-</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'><-</span> <span class='hs-varid'>getSrcSpanM</span> <a name="line-29"></a> <span class='hs-varid'>expr</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-conid'>InstOrigin</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TidyEnv</span> <a name="line-33"></a> <span class='hs-keyglyph'>-></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'><-</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'><+></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'><+></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'><+></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'><+></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></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'>-></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-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'><-</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' |> 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'>-></span> <span class='hs-conid'>Coercion</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-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'><-</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 |> 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'>-></span> <span class='hs-conid'>Coercion</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-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'><-</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'>-></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-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'>-></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'><-</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'><-</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 -> 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'>-></span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-></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'>-></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'><-</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'>-></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'><-</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 -> 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'>-></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-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'>-></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'><-</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'><-</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'>-></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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>TcTyVar</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Coercion</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>EqInstCo</span> <span class='hs-keyglyph'>-></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'><-</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'><-</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'><-</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'>-></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'><-</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'>-></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'>-></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'>-></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'>-></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'>-></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>