Fix another fundep error (fixes Trac #4969)
[ghc-hetmet.git] / compiler / typecheck / TcInteract.lhs
1 \begin{code}
2 module TcInteract ( 
3      solveInteract, solveInteractGiven, solveInteractWanted,
4      AtomicInert, tyVarsOfInert, 
5      InertSet, emptyInert, updInertSet, extractUnsolved, solveOne,
6   ) where  
7
8 #include "HsVersions.h"
9
10
11 import BasicTypes 
12 import TcCanonical
13 import VarSet
14 import Type
15
16 import Id 
17 import Var
18
19 import TcType
20 import HsBinds
21
22 import Inst( tyVarsOfEvVar )
23 import Class
24 import TyCon
25 import Name
26
27 import FunDeps
28
29 import Coercion
30 import Outputable
31
32 import TcRnTypes
33 import TcErrors
34 import TcSMonad
35 import Bag
36 import qualified Data.Map as Map
37
38 import Control.Monad( when )
39
40 import FastString ( sLit ) 
41 import DynFlags
42 \end{code}
43
44 Note [InertSet invariants]
45 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 An InertSet is a bag of canonical constraints, with the following invariants:
47
48   1 No two constraints react with each other. 
49     
50     A tricky case is when there exists a given (solved) dictionary 
51     constraint and a wanted identical constraint in the inert set, but do 
52     not react because reaction would create loopy dictionary evidence for 
53     the wanted. See note [Recursive dictionaries]
54
55   2 Given equalities form an idempotent substitution [none of the
56     given LHS's occur in any of the given RHS's or reactant parts]
57
58   3 Wanted equalities also form an idempotent substitution
59
60   4 The entire set of equalities is acyclic.
61
62   5 Wanted dictionaries are inert with the top-level axiom set 
63
64   6 Equalities of the form tv1 ~ tv2 always have a touchable variable
65     on the left (if possible).
66
67   7 No wanted constraints tv1 ~ tv2 with tv1 touchable. Such constraints
68     will be marked as solved right before being pushed into the inert set. 
69     See note [Touchables and givens].
70
71   8 No Given constraint mentions a touchable unification variable,
72     except if the
73  
74 Note that 6 and 7 are /not/ enforced by canonicalization but rather by 
75 insertion in the inert list, ie by TcInteract. 
76
77 During the process of solving, the inert set will contain some
78 previously given constraints, some wanted constraints, and some given
79 constraints which have arisen from solving wanted constraints. For
80 now we do not distinguish between given and solved constraints.
81
82 Note that we must switch wanted inert items to given when going under an
83 implication constraint (when in top-level inference mode).
84
85 \begin{code}
86
87 data CCanMap a = CCanMap { cts_given   :: Map.Map a CanonicalCts
88                                           -- Invariant: all Given
89                          , cts_derived :: Map.Map a CanonicalCts 
90                                           -- Invariant: all Derived
91                          , cts_wanted  :: Map.Map a CanonicalCts } 
92                                           -- Invariant: all Wanted
93
94 cCanMapToBag :: Ord a => CCanMap a -> CanonicalCts 
95 cCanMapToBag cmap = Map.fold unionBags rest_wder (cts_given cmap)
96   where rest_wder = Map.fold unionBags rest_der  (cts_wanted cmap) 
97         rest_der  = Map.fold unionBags emptyCCan (cts_derived cmap)
98
99 emptyCCanMap :: CCanMap a 
100 emptyCCanMap = CCanMap { cts_given = Map.empty
101                        , cts_derived = Map.empty, cts_wanted = Map.empty } 
102
103 updCCanMap:: Ord a => (a,CanonicalCt) -> CCanMap a -> CCanMap a 
104 updCCanMap (a,ct) cmap 
105   = case cc_flavor ct of 
106       Wanted {} 
107           -> cmap { cts_wanted = Map.insertWith unionBags a this_ct (cts_wanted cmap) } 
108       Given {} 
109           -> cmap { cts_given = Map.insertWith unionBags a this_ct (cts_given cmap) }
110       Derived {}
111           -> cmap { cts_derived = Map.insertWith unionBags a this_ct (cts_derived cmap) }
112   where this_ct = singleCCan ct 
113
114 getRelevantCts :: Ord a => a -> CCanMap a -> (CanonicalCts, CCanMap a) 
115 -- Gets the relevant constraints and returns the rest of the CCanMap
116 getRelevantCts a cmap 
117     = let relevant = unionManyBags [ Map.findWithDefault emptyCCan a (cts_wanted cmap)
118                                    , Map.findWithDefault emptyCCan a (cts_given cmap)
119                                    , Map.findWithDefault emptyCCan a (cts_derived cmap) ]
120           residual_map = cmap { cts_wanted = Map.delete a (cts_wanted cmap) 
121                               , cts_given = Map.delete a (cts_given cmap) 
122                               , cts_derived = Map.delete a (cts_derived cmap) }
123       in (relevant, residual_map) 
124
125 extractUnsolvedCMap :: Ord a => CCanMap a -> (CanonicalCts, CCanMap a)
126 -- Gets the wanted or derived constraints and returns a residual
127 -- CCanMap with only givens.
128 extractUnsolvedCMap cmap =
129   let wntd = Map.fold unionBags emptyCCan (cts_wanted cmap)
130       derd = Map.fold unionBags emptyCCan (cts_derived cmap)
131   in (wntd `unionBags` derd, 
132            cmap { cts_wanted = Map.empty, cts_derived = Map.empty })
133
134
135 -- See Note [InertSet invariants]
136 data InertSet 
137   = IS { inert_eqs          :: CanonicalCts               -- Equalities only (CTyEqCan)
138        , inert_dicts        :: CCanMap Class              -- Dictionaries only
139        , inert_ips          :: CCanMap (IPName Name)      -- Implicit parameters 
140        , inert_frozen       :: CanonicalCts
141        , inert_funeqs       :: CCanMap TyCon              -- Type family equalities only
142                -- This representation allows us to quickly get to the relevant 
143                -- inert constraints when interacting a work item with the inert set.
144        }
145
146 tyVarsOfInert :: InertSet -> TcTyVarSet 
147 tyVarsOfInert (IS { inert_eqs    = eqs
148                   , inert_dicts  = dictmap
149                   , inert_ips    = ipmap
150                   , inert_frozen = frozen
151                   , inert_funeqs = funeqmap }) = tyVarsOfCanonicals cts
152   where
153     cts = eqs `andCCan` frozen `andCCan` cCanMapToBag dictmap
154               `andCCan` cCanMapToBag ipmap `andCCan` cCanMapToBag funeqmap
155
156 instance Outputable InertSet where
157   ppr is = vcat [ vcat (map ppr (Bag.bagToList $ inert_eqs is))
158                 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_dicts is)))
159                 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_ips is))) 
160                 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_funeqs is)))
161                 , vcat (map ppr (Bag.bagToList $ inert_frozen is))
162                 ]
163                        
164 emptyInert :: InertSet
165 emptyInert = IS { inert_eqs    = Bag.emptyBag
166                 , inert_frozen = Bag.emptyBag
167                 , inert_dicts  = emptyCCanMap
168                 , inert_ips    = emptyCCanMap
169                 , inert_funeqs = emptyCCanMap }
170
171 updInertSet :: InertSet -> AtomicInert -> InertSet 
172 updInertSet is item 
173   | isCTyEqCan item                     -- Other equality 
174   = let eqs' = inert_eqs is `Bag.snocBag` item 
175     in is { inert_eqs = eqs' } 
176   | Just cls <- isCDictCan_Maybe item   -- Dictionary 
177   = is { inert_dicts = updCCanMap (cls,item) (inert_dicts is) } 
178   | Just x  <- isCIPCan_Maybe item      -- IP 
179   = is { inert_ips   = updCCanMap (x,item) (inert_ips is) }  
180   | Just tc <- isCFunEqCan_Maybe item   -- Function equality 
181   = is { inert_funeqs = updCCanMap (tc,item) (inert_funeqs is) }
182   | otherwise 
183   = is { inert_frozen = inert_frozen is `Bag.snocBag` item }
184
185 extractUnsolved :: InertSet -> (InertSet, CanonicalCts)
186 -- Postcondition: the returned canonical cts are either Derived, or Wanted.
187 extractUnsolved is@(IS {inert_eqs = eqs}) 
188   = let is_solved  = is { inert_eqs    = solved_eqs
189                         , inert_dicts  = solved_dicts
190                         , inert_ips    = solved_ips
191                         , inert_frozen = emptyCCan
192                         , inert_funeqs = solved_funeqs }
193     in (is_solved, unsolved)
194
195   where (unsolved_eqs, solved_eqs)       = Bag.partitionBag (not.isGivenCt) eqs
196         (unsolved_ips, solved_ips)       = extractUnsolvedCMap (inert_ips is) 
197         (unsolved_dicts, solved_dicts)   = extractUnsolvedCMap (inert_dicts is) 
198         (unsolved_funeqs, solved_funeqs) = extractUnsolvedCMap (inert_funeqs is) 
199
200         unsolved = unsolved_eqs `unionBags` inert_frozen is `unionBags`
201                    unsolved_ips `unionBags` unsolved_dicts `unionBags` unsolved_funeqs
202 \end{code}
203
204 %*********************************************************************
205 %*                                                                   * 
206 *                      Main Interaction Solver                       *
207 *                                                                    *
208 **********************************************************************
209
210 Note [Basic plan] 
211 ~~~~~~~~~~~~~~~~~
212 1. Canonicalise (unary)
213 2. Pairwise interaction (binary)
214     * Take one from work list 
215     * Try all pair-wise interactions with each constraint in inert
216    
217    As an optimisation, we prioritize the equalities both in the 
218    worklist and in the inerts. 
219
220 3. Try to solve spontaneously for equalities involving touchables 
221 4. Top-level interaction (binary wrt top-level)
222    Superclass decomposition belongs in (4), see note [Superclasses]
223
224 \begin{code}
225 type AtomicInert = CanonicalCt     -- constraint pulled from InertSet
226 type WorkItem    = CanonicalCt     -- constraint pulled from WorkList
227
228 -- A mixture of Given, Wanted, and Derived constraints. 
229 -- We split between equalities and the rest to process equalities first. 
230 type WorkList = CanonicalCts
231
232 unionWorkLists :: WorkList -> WorkList -> WorkList 
233 unionWorkLists = andCCan
234
235 isEmptyWorkList :: WorkList -> Bool 
236 isEmptyWorkList = isEmptyCCan 
237
238 emptyWorkList :: WorkList
239 emptyWorkList = emptyCCan
240
241 workListFromCCan :: CanonicalCt -> WorkList 
242 workListFromCCan = singleCCan
243
244 ------------------------
245 data StopOrContinue 
246   = Stop                        -- Work item is consumed
247   | ContinueWith WorkItem       -- Not consumed
248
249 instance Outputable StopOrContinue where
250   ppr Stop             = ptext (sLit "Stop")
251   ppr (ContinueWith w) = ptext (sLit "ContinueWith") <+> ppr w
252
253 -- Results after interacting a WorkItem as far as possible with an InertSet
254 data StageResult
255   = SR { sr_inerts     :: InertSet
256            -- The new InertSet to use (REPLACES the old InertSet)
257        , sr_new_work   :: WorkList
258            -- Any new work items generated (should be ADDED to the old WorkList)
259            -- Invariant: 
260            --    sr_stop = Just workitem => workitem is *not* in sr_inerts and
261            --                               workitem is inert wrt to sr_inerts
262        , sr_stop       :: StopOrContinue
263        }
264
265 instance Outputable StageResult where
266   ppr (SR { sr_inerts = inerts, sr_new_work = work, sr_stop = stop })
267     = ptext (sLit "SR") <+> 
268       braces (sep [ ptext (sLit "inerts =") <+> ppr inerts <> comma
269                   , ptext (sLit "new work =") <+> ppr work <> comma
270                   , ptext (sLit "stop =") <+> ppr stop])
271
272 type SubGoalDepth = Int   -- Starts at zero; used to limit infinite
273                           -- recursion of sub-goals
274 type SimplifierStage = SubGoalDepth -> WorkItem -> InertSet -> TcS StageResult 
275
276 -- Combine a sequence of simplifier 'stages' to create a pipeline 
277 runSolverPipeline :: SubGoalDepth
278                   -> [(String, SimplifierStage)]
279                   -> InertSet -> WorkItem 
280                   -> TcS (InertSet, WorkList)
281 -- Precondition: non-empty list of stages 
282 runSolverPipeline depth pipeline inerts workItem
283   = do { traceTcS "Start solver pipeline" $ 
284             vcat [ ptext (sLit "work item =") <+> ppr workItem
285                  , ptext (sLit "inerts    =") <+> ppr inerts]
286
287        ; let itr_in = SR { sr_inerts = inerts
288                          , sr_new_work = emptyWorkList
289                          , sr_stop = ContinueWith workItem }
290        ; itr_out <- run_pipeline pipeline itr_in
291        ; let new_inert 
292               = case sr_stop itr_out of 
293                   Stop              -> sr_inerts itr_out
294                   ContinueWith item -> sr_inerts itr_out `updInertSet` item
295        ; return (new_inert, sr_new_work itr_out) }
296   where 
297     run_pipeline :: [(String, SimplifierStage)]
298                  -> StageResult -> TcS StageResult
299     run_pipeline [] itr                         = return itr
300     run_pipeline _  itr@(SR { sr_stop = Stop }) = return itr
301
302     run_pipeline ((name,stage):stages) 
303                  (SR { sr_new_work = accum_work
304                      , sr_inerts   = inerts
305                      , sr_stop     = ContinueWith work_item })
306       = do { itr <- stage depth work_item inerts 
307            ; traceTcS ("Stage result (" ++ name ++ ")") (ppr itr)
308            ; let itr' = itr { sr_new_work = accum_work `unionWorkLists` sr_new_work itr }
309            ; run_pipeline stages itr' }
310 \end{code}
311
312 Example 1:
313   Inert:   {c ~ d, F a ~ t, b ~ Int, a ~ ty} (all given)
314   Reagent: a ~ [b] (given)
315
316 React with (c~d)     ==> IR (ContinueWith (a~[b]))  True    []
317 React with (F a ~ t) ==> IR (ContinueWith (a~[b]))  False   [F [b] ~ t]
318 React with (b ~ Int) ==> IR (ContinueWith (a~[Int]) True    []
319
320 Example 2:
321   Inert:  {c ~w d, F a ~g t, b ~w Int, a ~w ty}
322   Reagent: a ~w [b]
323
324 React with (c ~w d)   ==> IR (ContinueWith (a~[b]))  True    []
325 React with (F a ~g t) ==> IR (ContinueWith (a~[b]))  True    []    (can't rewrite given with wanted!)
326 etc.
327
328 Example 3:
329   Inert:  {a ~ Int, F Int ~ b} (given)
330   Reagent: F a ~ b (wanted)
331
332 React with (a ~ Int)   ==> IR (ContinueWith (F Int ~ b)) True []
333 React with (F Int ~ b) ==> IR Stop True []    -- after substituting we re-canonicalize and get nothing
334
335 \begin{code}
336 -- Main interaction solver: we fully solve the worklist 'in one go', 
337 -- returning an extended inert set.
338 --
339 -- See Note [Touchables and givens].
340 solveInteractGiven :: InertSet -> GivenLoc -> [EvVar] -> TcS InertSet
341 solveInteractGiven inert gloc evs
342   = do { (_, inert_ret) <- solveInteract inert $ listToBag $
343                            map mk_given evs
344        ; return inert_ret }
345   where
346     flav = Given gloc
347     mk_given ev = mkEvVarX ev flav
348
349 solveInteractWanted :: InertSet -> [WantedEvVar] -> TcS InertSet
350 solveInteractWanted inert wvs
351   = do { (_,inert_ret) <- solveInteract inert $ listToBag $
352                           map wantedToFlavored wvs
353        ; return inert_ret }
354
355 solveInteract :: InertSet -> Bag FlavoredEvVar -> TcS (Bool, InertSet)
356 -- Post: (True,  inert_set) means we managed to discharge all constraints
357 --                          without actually doing any interactions!
358 --       (False, inert_set) means some interactions occurred
359 solveInteract inert ws 
360   = do { dyn_flags <- getDynFlags
361        ; sctx <- getTcSContext
362
363        ; traceTcS "solveInteract, before clever canonicalization:" $
364          vcat [ text "ws = " <+>  ppr (mapBag (\(EvVarX ev ct)
365                                                    -> (ct,evVarPred ev)) ws)
366               , text "inert = " <+> ppr inert ]
367
368        ; (flag, inert_ret) <- foldrBagM (tryPreSolveAndInteract sctx dyn_flags) (True,inert) ws 
369                         -- use foldr to preserve the order
370
371        ; traceTcS "solveInteract, after clever canonicalization (and interaction):" $
372          vcat [ text "No interaction happened = " <+> ppr flag
373               , text "inert_ret = " <+> ppr inert_ret ]
374
375        ; return (flag, inert_ret) }
376
377
378 tryPreSolveAndInteract :: SimplContext
379                        -> DynFlags
380                        -> FlavoredEvVar
381                        -> (Bool, InertSet)
382                        -> TcS (Bool, InertSet)
383 -- Returns: True if it was able to discharge this constraint AND all previous ones
384 tryPreSolveAndInteract sctx dyn_flags flavev@(EvVarX ev_var fl) (all_previous_discharged, inert)
385   = do { let inert_cts = get_inert_cts (evVarPred ev_var)
386
387        ; this_one_discharged <- dischargeFromCCans inert_cts flavev
388
389        ; if this_one_discharged
390          then return (all_previous_discharged, inert)
391
392          else do
393        { extra_cts <- mkCanonical fl ev_var
394        ; inert_ret <- solveInteractWithDepth (ctxtStkDepth dyn_flags,0,[]) extra_cts inert
395        ; return (False, inert_ret) } }
396
397   where
398     get_inert_cts (ClassP clas _)
399       | simplEqsOnly sctx = emptyCCan
400       | otherwise         = fst (getRelevantCts clas (inert_dicts inert))
401     get_inert_cts (IParam {})
402       = emptyCCan -- We must not do the same thing for IParams, because (contrary
403                   -- to dictionaries), work items /must/ override inert items.
404                  -- See Note [Overriding implicit parameters] in TcInteract.
405     get_inert_cts (EqPred {})
406       = inert_eqs inert `unionBags` cCanMapToBag (inert_funeqs inert)
407
408 dischargeFromCCans :: CanonicalCts -> FlavoredEvVar -> TcS Bool
409 -- See if this (pre-canonicalised) work-item is identical to a 
410 -- one already in the inert set. Reasons:
411 --    a) Avoid creating superclass constraints for millions of incoming (Num a) constraints
412 --    b) Termination for improve_eqs in TcSimplify.simpl_loop
413 dischargeFromCCans cans (EvVarX ev fl)
414   = Bag.foldrBag discharge_ct (return False) cans
415   where 
416     the_pred = evVarPred ev
417
418     discharge_ct :: CanonicalCt -> TcS Bool -> TcS Bool
419     discharge_ct ct _rest
420       | evVarPred (cc_id ct) `tcEqPred` the_pred
421       , cc_flavor ct `canSolve` fl
422       = do { when (isWanted fl) $ set_ev_bind ev (cc_id ct) 
423                  -- Deriveds need no evidence
424                  -- For Givens, we already have evidence, and we don't need it twice 
425            ; return True }
426       where 
427          set_ev_bind x y
428             | EqPred {} <- evVarPred y = setEvBind x (EvCoercion (mkCoVarCoercion y))
429             | otherwise                = setEvBind x (EvId y)
430
431     discharge_ct _ct rest = rest
432 \end{code}
433
434 Note [Avoiding the superclass explosion] 
435 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
436 This note now is not as significant as it used to be because we no
437 longer add the superclasses of Wanted as Derived, except only if they
438 have equality superclasses or superclasses with functional
439 dependencies. The fear was that hundreds of identical wanteds would
440 give rise each to the same superclass or equality Derived's which
441 would lead to a blo-up in the number of interactions.
442
443 Instead, what we do with tryPreSolveAndCanon, is when we encounter a
444 new constraint, we very quickly see if it can be immediately
445 discharged by a class constraint in our inert set or the previous
446 canonicals. If so, we add nothing to the returned canonical
447 constraints.
448
449 \begin{code}
450 solveOne :: WorkItem -> InertSet -> TcS InertSet 
451 solveOne workItem inerts 
452   = do { dyn_flags <- getDynFlags
453        ; solveOneWithDepth (ctxtStkDepth dyn_flags,0,[]) workItem inerts
454        }
455
456 -----------------
457 solveInteractWithDepth :: (Int, Int, [WorkItem])
458                        -> WorkList -> InertSet -> TcS InertSet
459 solveInteractWithDepth ctxt@(max_depth,n,stack) ws inert
460   | isEmptyWorkList ws
461   = return inert
462
463   | n > max_depth 
464   = solverDepthErrorTcS n stack
465
466   | otherwise 
467   = do { traceTcS "solveInteractWithDepth" $ 
468               vcat [ text "Current depth =" <+> ppr n
469                    , text "Max depth =" <+> ppr max_depth
470                    , text "ws =" <+> ppr ws ]
471
472               -- Solve equalities first
473        ; let (eqs, non_eqs) = Bag.partitionBag isCTyEqCan ws
474        ; is_from_eqs <- Bag.foldrBagM (solveOneWithDepth ctxt) inert eqs
475        ; Bag.foldrBagM (solveOneWithDepth ctxt) is_from_eqs non_eqs }
476                         -- use foldr to preserve the order
477
478 ------------------
479 -- Fully interact the given work item with an inert set, and return a
480 -- new inert set which has assimilated the new information.
481 solveOneWithDepth :: (Int, Int, [WorkItem])
482                   -> WorkItem -> InertSet -> TcS InertSet
483 solveOneWithDepth (max_depth, depth, stack) work inert
484   = do { traceFireTcS depth (text "Solving {" <+> ppr work)
485        ; (new_inert, new_work) <- runSolverPipeline depth thePipeline inert work
486          
487          -- Recursively solve the new work generated 
488          -- from workItem, with a greater depth
489        ; res_inert <- solveInteractWithDepth (max_depth, depth+1, work:stack) new_work new_inert 
490
491        ; traceFireTcS depth (text "Done }" <+> ppr work) 
492
493        ; return res_inert }
494
495 thePipeline :: [(String,SimplifierStage)]
496 thePipeline = [ ("interact with inert eqs", interactWithInertEqsStage)
497               , ("interact with inerts",    interactWithInertsStage)
498               , ("spontaneous solve",       spontaneousSolveStage)
499               , ("top-level reactions",     topReactionsStage) ]
500 \end{code}
501
502 *********************************************************************************
503 *                                                                               * 
504                        The spontaneous-solve Stage
505 *                                                                               *
506 *********************************************************************************
507
508 Note [Efficient Orientation] 
509 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
510
511 There are two cases where we have to be careful about 
512 orienting equalities to get better efficiency. 
513
514 Case 1: In Rewriting Equalities (function rewriteEqLHS) 
515
516     When rewriting two equalities with the same LHS:
517           (a)  (tv ~ xi1) 
518           (b)  (tv ~ xi2) 
519     We have a choice of producing work (xi1 ~ xi2) (up-to the
520     canonicalization invariants) However, to prevent the inert items
521     from getting kicked out of the inerts first, we prefer to
522     canonicalize (xi1 ~ xi2) if (b) comes from the inert set, or (xi2
523     ~ xi1) if (a) comes from the inert set.
524     
525     This choice is implemented using the WhichComesFromInert flag. 
526
527 Case 2: Functional Dependencies 
528     Again, we should prefer, if possible, the inert variables on the RHS
529
530 Case 3: IP improvement work
531     We must always rewrite so that the inert type is on the right. 
532
533 \begin{code}
534 spontaneousSolveStage :: SimplifierStage 
535 spontaneousSolveStage depth workItem inerts 
536   = do { mSolve <- trySpontaneousSolve workItem
537
538        ; case mSolve of 
539            SPCantSolve -> -- No spontaneous solution for him, keep going
540                return $ SR { sr_new_work   = emptyWorkList
541                            , sr_inerts     = inerts
542                            , sr_stop       = ContinueWith workItem }
543
544            SPSolved workItem'
545                | not (isGivenCt workItem) 
546                  -- Original was wanted or derived but we have now made him 
547                  -- given so we have to interact him with the inerts due to
548                  -- its status change. This in turn may produce more work.
549                  -- We do this *right now* (rather than just putting workItem'
550                  -- back into the work-list) because we've solved 
551                -> do { bumpStepCountTcS
552                      ; traceFireTcS depth (ptext (sLit "Spontaneous (w/d)") <+> ppr workItem)
553                      ; (new_inert, new_work) <- runSolverPipeline depth
554                              [ ("recursive interact with inert eqs", interactWithInertEqsStage)
555                              , ("recursive interact with inerts", interactWithInertsStage)
556                              ] inerts workItem'
557                      ; return $ SR { sr_new_work = new_work 
558                                    , sr_inerts   = new_inert -- will include workItem' 
559                                    , sr_stop     = Stop }
560                      }
561                | otherwise 
562                    -> -- Original was given; he must then be inert all right, and
563                       -- workList' are all givens from flattening
564                       do { bumpStepCountTcS
565                          ; traceFireTcS depth (ptext (sLit "Spontaneous (g)") <+> ppr workItem)
566                          ; return $ SR { sr_new_work = emptyWorkList
567                                        , sr_inerts   = inerts `updInertSet` workItem' 
568                                        , sr_stop     = Stop } }
569            SPError -> -- Return with no new work
570                return $ SR { sr_new_work = emptyWorkList
571                            , sr_inerts   = inerts
572                            , sr_stop     = Stop }
573        }
574
575 data SPSolveResult = SPCantSolve | SPSolved WorkItem | SPError
576 -- SPCantSolve means that we can't do the unification because e.g. the variable is untouchable
577 -- SPSolved workItem' gives us a new *given* to go on 
578 -- SPError means that it's completely impossible to solve this equality, eg due to a kind error
579
580
581 -- @trySpontaneousSolve wi@ solves equalities where one side is a
582 -- touchable unification variable.
583 --          See Note [Touchables and givens] 
584 trySpontaneousSolve :: WorkItem -> TcS SPSolveResult
585 trySpontaneousSolve workItem@(CTyEqCan { cc_id = cv, cc_flavor = gw, cc_tyvar = tv1, cc_rhs = xi })
586   | isGiven gw
587   = return SPCantSolve
588   | Just tv2 <- tcGetTyVar_maybe xi
589   = do { tch1 <- isTouchableMetaTyVar tv1
590        ; tch2 <- isTouchableMetaTyVar tv2
591        ; case (tch1, tch2) of
592            (True,  True)  -> trySpontaneousEqTwoWay cv gw tv1 tv2
593            (True,  False) -> trySpontaneousEqOneWay cv gw tv1 xi
594            (False, True)  -> trySpontaneousEqOneWay cv gw tv2 (mkTyVarTy tv1)
595            _ -> return SPCantSolve }
596   | otherwise
597   = do { tch1 <- isTouchableMetaTyVar tv1
598        ; if tch1 then trySpontaneousEqOneWay cv gw tv1 xi
599                  else do { traceTcS "Untouchable LHS, can't spontaneously solve workitem:" 
600                                     (ppr workItem) 
601                          ; return SPCantSolve }
602        }
603
604   -- No need for 
605   --      trySpontaneousSolve (CFunEqCan ...) = ...
606   -- See Note [No touchables as FunEq RHS] in TcSMonad
607 trySpontaneousSolve _ = return SPCantSolve
608
609 ----------------
610 trySpontaneousEqOneWay :: CoVar -> CtFlavor -> TcTyVar -> Xi -> TcS SPSolveResult
611 -- tv is a MetaTyVar, not untouchable
612 trySpontaneousEqOneWay cv gw tv xi      
613   | not (isSigTyVar tv) || isTyVarTy xi 
614   = do { let kxi = typeKind xi -- NB: 'xi' is fully rewritten according to the inerts 
615                                -- so we have its more specific kind in our hands
616        ; if kxi `isSubKind` tyVarKind tv then
617              solveWithIdentity cv gw tv xi
618          else return SPCantSolve
619 {-
620          else if tyVarKind tv `isSubKind` kxi then
621              return SPCantSolve -- kinds are compatible but we can't solveWithIdentity this way
622                                 -- This case covers the  a_touchable :: * ~ b_untouchable :: ?? 
623                                 -- which has to be deferred or floated out for someone else to solve 
624                                 -- it in a scope where 'b' is no longer untouchable.
625          else do { addErrorTcS KindError gw (mkTyVarTy tv) xi -- See Note [Kind errors]
626                  ; return SPError }
627 -}
628        }
629   | otherwise -- Still can't solve, sig tyvar and non-variable rhs
630   = return SPCantSolve
631
632 ----------------
633 trySpontaneousEqTwoWay :: CoVar -> CtFlavor -> TcTyVar -> TcTyVar -> TcS SPSolveResult
634 -- Both tyvars are *touchable* MetaTyvars so there is only a chance for kind error here
635 trySpontaneousEqTwoWay cv gw tv1 tv2
636   | k1 `isSubKind` k2
637   , nicer_to_update_tv2 = solveWithIdentity cv gw tv2 (mkTyVarTy tv1)
638   | k2 `isSubKind` k1 
639   = solveWithIdentity cv gw tv1 (mkTyVarTy tv2)
640   | otherwise -- None is a subkind of the other, but they are both touchable! 
641   = return SPCantSolve
642     -- do { addErrorTcS KindError gw (mkTyVarTy tv1) (mkTyVarTy tv2)
643     --   ; return SPError }
644   where
645     k1 = tyVarKind tv1
646     k2 = tyVarKind tv2
647     nicer_to_update_tv2 = isSigTyVar tv1 || isSystemName (Var.varName tv2)
648 \end{code}
649
650 Note [Kind errors] 
651 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
652 Consider the wanted problem: 
653       alpha ~ (# Int, Int #) 
654 where alpha :: ?? and (# Int, Int #) :: (#). We can't spontaneously solve this constraint, 
655 but we should rather reject the program that give rise to it. If 'trySpontaneousEqTwoWay' 
656 simply returns @CantSolve@ then that wanted constraint is going to propagate all the way and 
657 get quantified over in inference mode. That's bad because we do know at this point that the 
658 constraint is insoluble. Instead, we call 'recKindErrorTcS' here, which will fail later on.
659
660 The same applies in canonicalization code in case of kind errors in the givens. 
661
662 However, when we canonicalize givens we only check for compatibility (@compatKind@). 
663 If there were a kind error in the givens, this means some form of inconsistency or dead code.
664
665 You may think that when we spontaneously solve wanteds we may have to look through the 
666 bindings to determine the right kind of the RHS type. E.g one may be worried that xi is 
667 @alpha@ where alpha :: ? and a previous spontaneous solving has set (alpha := f) with (f :: *).
668 But we orient our constraints so that spontaneously solved ones can rewrite all other constraint
669 so this situation can't happen. 
670
671 Note [Spontaneous solving and kind compatibility] 
672 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
673 Note that our canonical constraints insist that *all* equalities (tv ~
674 xi) or (F xis ~ rhs) require the LHS and the RHS to have *compatible*
675 the same kinds.  ("compatible" means one is a subKind of the other.)
676
677   - It can't be *equal* kinds, because
678      b) wanted constraints don't necessarily have identical kinds
679                eg   alpha::? ~ Int
680      b) a solved wanted constraint becomes a given
681
682   - SPJ thinks that *given* constraints (tv ~ tau) always have that
683     tau has a sub-kind of tv; and when solving wanted constraints
684     in trySpontaneousEqTwoWay we re-orient to achieve this.
685
686   - Note that the kind invariant is maintained by rewriting.
687     Eg wanted1 rewrites wanted2; if both were compatible kinds before,
688        wanted2 will be afterwards.  Similarly givens.
689
690 Caveat:
691   - Givens from higher-rank, such as: 
692           type family T b :: * -> * -> * 
693           type instance T Bool = (->) 
694
695           f :: forall a. ((T a ~ (->)) => ...) -> a -> ... 
696           flop = f (...) True 
697      Whereas we would be able to apply the type instance, we would not be able to 
698      use the given (T Bool ~ (->)) in the body of 'flop' 
699
700
701 Note [Avoid double unifications] 
702 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
703 The spontaneous solver has to return a given which mentions the unified unification
704 variable *on the left* of the equality. Here is what happens if not: 
705   Original wanted:  (a ~ alpha),  (alpha ~ Int) 
706 We spontaneously solve the first wanted, without changing the order! 
707       given : a ~ alpha      [having unified alpha := a] 
708 Now the second wanted comes along, but he cannot rewrite the given, so we simply continue.
709 At the end we spontaneously solve that guy, *reunifying*  [alpha := Int] 
710
711 We avoid this problem by orienting the resulting given so that the unification
712 variable is on the left.  [Note that alternatively we could attempt to
713 enforce this at canonicalization]
714
715 See also Note [No touchables as FunEq RHS] in TcSMonad; avoiding
716 double unifications is the main reason we disallow touchable
717 unification variables as RHS of type family equations: F xis ~ alpha.
718
719 \begin{code}
720 ----------------
721
722 solveWithIdentity :: CoVar -> CtFlavor -> TcTyVar -> Xi -> TcS SPSolveResult
723 -- Solve with the identity coercion 
724 -- Precondition: kind(xi) is a sub-kind of kind(tv)
725 -- Precondition: CtFlavor is Wanted or Derived
726 -- See [New Wanted Superclass Work] to see why solveWithIdentity 
727 --     must work for Derived as well as Wanted
728 -- Returns: workItem where 
729 --        workItem = the new Given constraint
730 solveWithIdentity cv wd tv xi 
731   = do { traceTcS "Sneaky unification:" $ 
732                        vcat [text "Coercion variable:  " <+> ppr wd, 
733                              text "Coercion:           " <+> pprEq (mkTyVarTy tv) xi,
734                              text "Left  Kind is     : " <+> ppr (typeKind (mkTyVarTy tv)),
735                              text "Right Kind is     : " <+> ppr (typeKind xi)
736                   ]
737
738        ; setWantedTyBind tv xi
739        ; cv_given <- newGivenCoVar (mkTyVarTy tv) xi xi
740
741        ; when (isWanted wd) (setCoBind cv xi)
742            -- We don't want to do this for Derived, that's why we use 'when (isWanted wd)'
743
744        ; return $ SPSolved (CTyEqCan { cc_id = cv_given
745                                      , cc_flavor = mkGivenFlavor wd UnkSkol
746                                      , cc_tyvar  = tv, cc_rhs = xi }) }
747 \end{code}
748
749
750 *********************************************************************************
751 *                                                                               * 
752                        The interact-with-inert Stage
753 *                                                                               *
754 *********************************************************************************
755
756 Note [The Solver Invariant]
757 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
758 We always add Givens first.  So you might think that the solver has
759 the invariant
760
761    If the work-item is Given, 
762    then the inert item must Given
763
764 But this isn't quite true.  Suppose we have, 
765     c1: [W] beta ~ [alpha], c2 : [W] blah, c3 :[W] alpha ~ Int
766 After processing the first two, we get
767      c1: [G] beta ~ [alpha], c2 : [W] blah
768 Now, c3 does not interact with the the given c1, so when we spontaneously
769 solve c3, we must re-react it with the inert set.  So we can attempt a 
770 reaction between inert c2 [W] and work-item c3 [G].
771
772 It *is* true that [Solver Invariant]
773    If the work-item is Given, 
774    AND there is a reaction
775    then the inert item must Given
776 or, equivalently,
777    If the work-item is Given, 
778    and the inert item is Wanted/Derived
779    then there is no reaction
780
781 \begin{code}
782 -- Interaction result of  WorkItem <~> AtomicInert
783 data InteractResult
784    = IR { ir_stop         :: StopOrContinue
785             -- Stop
786             --   => Reagent (work item) consumed.
787             -- ContinueWith new_reagent
788             --   => Reagent transformed but keep gathering interactions. 
789             --      The transformed item remains inert with respect 
790             --      to any previously encountered inerts.
791
792         , ir_inert_action :: InertAction
793             -- Whether the inert item should remain in the InertSet.
794
795         , ir_new_work     :: WorkList
796             -- new work items to add to the WorkList
797
798         , ir_fire :: Maybe String    -- Tells whether a rule fired, and if so what
799         }
800
801 -- What to do with the inert reactant.
802 data InertAction = KeepInert | DropInert 
803
804 mkIRContinue :: String -> WorkItem -> InertAction -> WorkList -> TcS InteractResult
805 mkIRContinue rule wi keep newWork 
806   = return $ IR { ir_stop = ContinueWith wi, ir_inert_action = keep
807                 , ir_new_work = newWork, ir_fire = Just rule }
808
809 mkIRStopK :: String -> WorkList -> TcS InteractResult
810 mkIRStopK rule newWork
811   = return $ IR { ir_stop = Stop, ir_inert_action = KeepInert
812                 , ir_new_work = newWork, ir_fire = Just rule }
813
814 mkIRStopD :: String -> WorkList -> TcS InteractResult
815 mkIRStopD rule newWork
816   = return $ IR { ir_stop = Stop, ir_inert_action = DropInert
817                 , ir_new_work = newWork, ir_fire = Just rule }
818
819 noInteraction :: Monad m => WorkItem -> m InteractResult
820 noInteraction wi
821   = return $ IR { ir_stop = ContinueWith wi, ir_inert_action = KeepInert
822                 , ir_new_work = emptyWorkList, ir_fire = Nothing }
823
824 data WhichComesFromInert = LeftComesFromInert | RightComesFromInert 
825      -- See Note [Efficient Orientation] 
826
827
828 ---------------------------------------------------
829 -- Interact a single WorkItem with the equalities of an inert set as
830 -- far as possible, i.e. until we get a Stop result from an individual
831 -- reaction (i.e. when the WorkItem is consumed), or until we've
832 -- interact the WorkItem with the entire equalities of the InertSet
833
834 interactWithInertEqsStage :: SimplifierStage 
835 interactWithInertEqsStage depth workItem inert
836   = Bag.foldrBagM (interactNext depth) initITR (inert_eqs inert)
837                         -- use foldr to preserve the order
838   where
839     initITR = SR { sr_inerts   = inert { inert_eqs = emptyCCan }
840                  , sr_new_work = emptyWorkList
841                  , sr_stop     = ContinueWith workItem }
842
843 ---------------------------------------------------
844 -- Interact a single WorkItem with *non-equality* constraints in the inert set. 
845 -- Precondition: equality interactions must have already happened, hence we have 
846 -- to pick up some information from the incoming inert, before folding over the 
847 -- "Other" constraints it contains!
848
849 interactWithInertsStage :: SimplifierStage
850 interactWithInertsStage depth workItem inert
851   = let (relevant, inert_residual) = getISRelevant workItem inert 
852         initITR = SR { sr_inerts   = inert_residual
853                      , sr_new_work = emptyWorkList
854                      , sr_stop     = ContinueWith workItem } 
855     in Bag.foldrBagM (interactNext depth) initITR relevant 
856                         -- use foldr to preserve the order
857   where 
858     getISRelevant :: CanonicalCt -> InertSet -> (CanonicalCts, InertSet) 
859     getISRelevant (CFrozenErr {}) is = (emptyCCan, is)
860                   -- Nothing s relevant; we have alread interacted
861                   -- it with the equalities in the inert set
862
863     getISRelevant (CDictCan { cc_class = cls } ) is
864       = let (relevant, residual_map) = getRelevantCts cls (inert_dicts is)
865         in (relevant, is { inert_dicts = residual_map }) 
866     getISRelevant (CFunEqCan { cc_fun = tc } ) is 
867       = let (relevant, residual_map) = getRelevantCts tc (inert_funeqs is) 
868         in (relevant, is { inert_funeqs = residual_map })
869     getISRelevant (CIPCan { cc_ip_nm = nm }) is 
870       = let (relevant, residual_map) = getRelevantCts nm (inert_ips is)
871         in (relevant, is { inert_ips = residual_map }) 
872     -- An equality, finally, may kick everything except equalities out 
873     -- because we have already interacted the equalities in interactWithInertEqsStage
874     getISRelevant _eq_ct is  -- Equality, everything is relevant for this one 
875                              -- TODO: if we were caching variables, we'd know that only 
876                              --       some are relevant. Experiment with this for now. 
877       = let cts = cCanMapToBag (inert_ips is) `unionBags` 
878                     cCanMapToBag (inert_dicts is) `unionBags` cCanMapToBag (inert_funeqs is)
879         in (cts, is { inert_dicts  = emptyCCanMap
880                     , inert_ips    = emptyCCanMap
881                     , inert_funeqs = emptyCCanMap })
882
883 interactNext :: SubGoalDepth -> AtomicInert -> StageResult -> TcS StageResult 
884 interactNext depth inert it
885   | ContinueWith work_item <- sr_stop it
886   = do { let inerts = sr_inerts it 
887
888        ; IR { ir_new_work = new_work, ir_inert_action = inert_action
889             , ir_fire = fire_info, ir_stop = stop } 
890             <- interactWithInert inert work_item
891
892        ; let mk_msg rule 
893                = text rule <+> keep_doc
894                  <+> vcat [ ptext (sLit "Inert =") <+> ppr inert
895                           , ptext (sLit "Work =")  <+> ppr work_item
896                           , ppUnless (isEmptyBag new_work) $
897                             ptext (sLit "New =") <+> ppr new_work ]
898              keep_doc = case inert_action of
899                           KeepInert -> ptext (sLit "[keep]")
900                           DropInert -> ptext (sLit "[drop]")
901        ; case fire_info of
902            Just rule -> do { bumpStepCountTcS
903                            ; traceFireTcS depth (mk_msg rule) }
904            Nothing  -> return ()
905
906        -- New inerts depend on whether we KeepInert or not 
907        ; let inerts_new = case inert_action of
908                             KeepInert -> inerts `updInertSet` inert
909                             DropInert -> inerts
910
911        ; return $ SR { sr_inerts   = inerts_new
912                      , sr_new_work = sr_new_work it `unionWorkLists` new_work
913                      , sr_stop     = stop } }
914   | otherwise 
915   = return $ it { sr_inerts = (sr_inerts it) `updInertSet` inert }
916
917 -- Do a single interaction of two constraints.
918 interactWithInert :: AtomicInert -> WorkItem -> TcS InteractResult
919 interactWithInert inert workItem 
920   = do { ctxt <- getTcSContext
921        ; let is_allowed  = allowedInteraction (simplEqsOnly ctxt) inert workItem 
922
923        ; if is_allowed then 
924               doInteractWithInert inert workItem 
925           else 
926               noInteraction workItem 
927        }
928
929 allowedInteraction :: Bool -> AtomicInert -> WorkItem -> Bool 
930 -- Allowed interactions 
931 allowedInteraction eqs_only (CDictCan {}) (CDictCan {}) = not eqs_only
932 allowedInteraction eqs_only (CIPCan {})   (CIPCan {})   = not eqs_only
933 allowedInteraction _ _ _ = True 
934
935 --------------------------------------------
936 doInteractWithInert :: CanonicalCt -> CanonicalCt -> TcS InteractResult
937 -- Identical class constraints.
938
939 doInteractWithInert
940   inertItem@(CDictCan { cc_id = d1, cc_flavor = fl1, cc_class = cls1, cc_tyargs = tys1 }) 
941    workItem@(CDictCan { cc_id = d2, cc_flavor = fl2, cc_class = cls2, cc_tyargs = tys2 })
942   | cls1 == cls2 && (and $ zipWith tcEqType tys1 tys2)
943   = solveOneFromTheOther "Cls/Cls" (EvId d1,fl1) workItem 
944
945   | cls1 == cls2 && (not (isGiven fl1 && isGiven fl2))
946   =      -- See Note [When improvement happens]
947     do { let pty1 = ClassP cls1 tys1
948              pty2 = ClassP cls2 tys2
949              inert_pred_loc     = (pty1, pprFlavorArising fl1)
950              work_item_pred_loc = (pty2, pprFlavorArising fl2)
951              fd_eqns = improveFromAnother 
952                                   inert_pred_loc     -- the template
953                                   work_item_pred_loc -- the one we aim to rewrite
954                                   -- See Note [Efficient Orientation]
955
956        ; m <- rewriteWithFunDeps fd_eqns tys2 fl2
957        ; case m of 
958            Nothing -> noInteraction workItem
959            Just (rewritten_tys2, cos2, fd_work)
960              | tcEqTypes tys1 rewritten_tys2
961              -> -- Solve him on the spot in this case
962                 case fl2 of
963                   Given   {} -> pprPanic "Unexpected given" (ppr inertItem $$ ppr workItem)
964                   Derived {} -> mkIRStopK "Cls/Cls fundep (solved)" fd_work
965                   Wanted  {} 
966                     | isDerived fl1 
967                    -> do { setDictBind d2 (EvCast d1 dict_co)
968                          ; let inert_w = inertItem { cc_flavor = fl2 }
969                            -- A bit naughty: we take the inert Derived, 
970                            -- turn it into a Wanted, use it to solve the work-item
971                            -- and put it back into the work-list
972                            -- Maybe rather than starting again, we could *replace* the
973                            -- inert item, but its safe and simple to restart
974                          ; mkIRStopD "Cls/Cls fundep (solved)" (inert_w `consBag` fd_work) }
975
976                     | otherwise 
977                     -> do { setDictBind d2 (EvCast d1 dict_co)
978                           ; mkIRStopK "Cls/Cls fundep (solved)" fd_work }
979
980              | otherwise
981              -> -- We could not quite solve him, but we still rewrite him
982                 -- Example: class C a b c | a -> b
983                 --          Given: C Int Bool x, Wanted: C Int beta y
984                 --          Then rewrite the wanted to C Int Bool y
985                 --          but note that is still not identical to the given
986                 -- The important thing is that the rewritten constraint is
987                 -- inert wrt the given.
988                 -- However it is not necessarily inert wrt previous inert-set items.
989                 --      class C a b c d |  a -> b, b c -> d
990                 --      Inert: c1: C b Q R S, c2: C P Q a b
991                 --      Work: C P alpha R beta
992                 --      Does not react with c1; reacts with c2, with alpha:=Q
993                 --      NOW it reacts with c1!
994                 -- So we must stop, and put the rewritten constraint back in the work list
995                 do { d2' <- newDictVar cls1 rewritten_tys2
996                    ; case fl2 of
997                        Given {}   -> pprPanic "Unexpected given" (ppr inertItem $$ ppr workItem)
998                        Wanted {}  -> setDictBind d2 (EvCast d2' dict_co)
999                        Derived {} -> return ()
1000                    ; let workItem' = workItem { cc_id = d2', cc_tyargs = rewritten_tys2 }
1001                    ; mkIRStopK "Cls/Cls fundep (partial)" (workItem' `consBag` fd_work) } 
1002
1003              where
1004                dict_co = mkTyConCoercion (classTyCon cls1) cos2
1005   }
1006
1007 -- Class constraint and given equality: use the equality to rewrite
1008 -- the class constraint. 
1009 doInteractWithInert (CTyEqCan { cc_id = cv, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi }) 
1010                     (CDictCan { cc_id = dv, cc_flavor = wfl, cc_class = cl, cc_tyargs = xis }) 
1011   | ifl `canRewrite` wfl 
1012   , tv `elemVarSet` tyVarsOfTypes xis
1013   = do { rewritten_dict <- rewriteDict (cv,tv,xi) (dv,wfl,cl,xis)
1014             -- Continue with rewritten Dictionary because we can only be in the 
1015             -- interactWithEqsStage, so the dictionary is inert. 
1016        ; mkIRContinue "Eq/Cls" rewritten_dict KeepInert emptyWorkList }
1017     
1018 doInteractWithInert (CDictCan { cc_id = dv, cc_flavor = ifl, cc_class = cl, cc_tyargs = xis }) 
1019            workItem@(CTyEqCan { cc_id = cv, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi })
1020   | wfl `canRewrite` ifl
1021   , tv `elemVarSet` tyVarsOfTypes xis
1022   = do { rewritten_dict <- rewriteDict (cv,tv,xi) (dv,ifl,cl,xis)
1023        ; mkIRContinue "Cls/Eq" workItem DropInert (workListFromCCan rewritten_dict) }
1024
1025 -- Class constraint and given equality: use the equality to rewrite
1026 -- the class constraint.
1027 doInteractWithInert (CTyEqCan { cc_id = cv, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi }) 
1028                     (CIPCan { cc_id = ipid, cc_flavor = wfl, cc_ip_nm = nm, cc_ip_ty = ty }) 
1029   | ifl `canRewrite` wfl
1030   , tv `elemVarSet` tyVarsOfType ty 
1031   = do { rewritten_ip <- rewriteIP (cv,tv,xi) (ipid,wfl,nm,ty) 
1032        ; mkIRContinue "Eq/IP" rewritten_ip KeepInert emptyWorkList } 
1033
1034 doInteractWithInert (CIPCan { cc_id = ipid, cc_flavor = ifl, cc_ip_nm = nm, cc_ip_ty = ty }) 
1035            workItem@(CTyEqCan { cc_id = cv, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi })
1036   | wfl `canRewrite` ifl
1037   , tv `elemVarSet` tyVarsOfType ty
1038   = do { rewritten_ip <- rewriteIP (cv,tv,xi) (ipid,ifl,nm,ty) 
1039        ; mkIRContinue "IP/Eq" workItem DropInert (workListFromCCan rewritten_ip) }
1040
1041 -- Two implicit parameter constraints.  If the names are the same,
1042 -- but their types are not, we generate a wanted type equality 
1043 -- that equates the type (this is "improvement").  
1044 -- However, we don't actually need the coercion evidence,
1045 -- so we just generate a fresh coercion variable that isn't used anywhere.
1046 doInteractWithInert (CIPCan { cc_id = id1, cc_flavor = ifl, cc_ip_nm = nm1, cc_ip_ty = ty1 }) 
1047            workItem@(CIPCan { cc_flavor = wfl, cc_ip_nm = nm2, cc_ip_ty = ty2 })
1048   | nm1 == nm2 && isGiven wfl && isGiven ifl
1049   =     -- See Note [Overriding implicit parameters]
1050         -- Dump the inert item, override totally with the new one
1051         -- Do not require type equality
1052         -- For example, given let ?x::Int = 3 in let ?x::Bool = True in ...
1053         --              we must *override* the outer one with the inner one
1054     mkIRContinue "IP/IP override" workItem DropInert emptyWorkList
1055
1056   | nm1 == nm2 && ty1 `tcEqType` ty2 
1057   = solveOneFromTheOther "IP/IP" (EvId id1,ifl) workItem 
1058
1059   | nm1 == nm2
1060   =     -- See Note [When improvement happens]
1061     do { co_var <- newCoVar ty2 ty1 -- See Note [Efficient Orientation]
1062        ; let flav = Wanted (combineCtLoc ifl wfl) 
1063        ; cans <- mkCanonical flav co_var 
1064        ; mkIRContinue "IP/IP fundep" workItem KeepInert cans }
1065
1066 -- Never rewrite a given with a wanted equality, and a type function
1067 -- equality can never rewrite an equality. We rewrite LHS *and* RHS 
1068 -- of function equalities so that our inert set exposes everything that 
1069 -- we know about equalities.
1070
1071 -- Inert: equality, work item: function equality
1072 doInteractWithInert (CTyEqCan { cc_id = cv1, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi1 }) 
1073                     (CFunEqCan { cc_id = cv2, cc_flavor = wfl, cc_fun = tc
1074                                , cc_tyargs = args, cc_rhs = xi2 })
1075   | ifl `canRewrite` wfl 
1076   , tv `elemVarSet` tyVarsOfTypes (xi2:args) -- Rewrite RHS as well
1077   = do { rewritten_funeq <- rewriteFunEq (cv1,tv,xi1) (cv2,wfl,tc,args,xi2) 
1078        ; mkIRStopK "Eq/FunEq" (workListFromCCan rewritten_funeq) } 
1079          -- Must Stop here, because we may no longer be inert after the rewritting.
1080
1081 -- Inert: function equality, work item: equality
1082 doInteractWithInert (CFunEqCan {cc_id = cv1, cc_flavor = ifl, cc_fun = tc
1083                               , cc_tyargs = args, cc_rhs = xi1 }) 
1084            workItem@(CTyEqCan { cc_id = cv2, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi2 })
1085   | wfl `canRewrite` ifl
1086   , tv `elemVarSet` tyVarsOfTypes (xi1:args) -- Rewrite RHS as well
1087   = do { rewritten_funeq <- rewriteFunEq (cv2,tv,xi2) (cv1,ifl,tc,args,xi1) 
1088        ; mkIRContinue "FunEq/Eq" workItem DropInert (workListFromCCan rewritten_funeq) } 
1089          -- One may think that we could (KeepTransformedInert rewritten_funeq) 
1090          -- but that is wrong, because it may end up not being inert with respect 
1091          -- to future inerts. Example: 
1092          -- Original inert = {    F xis ~  [a], b ~ Maybe Int } 
1093          -- Work item comes along = a ~ [b] 
1094          -- If we keep { F xis ~ [b] } in the inert set we will end up with: 
1095          --      { F xis ~ [b], b ~ Maybe Int, a ~ [Maybe Int] } 
1096          -- At the end, which is *not* inert. So we should unfortunately DropInert here.
1097
1098 doInteractWithInert (CFunEqCan { cc_id = cv1, cc_flavor = fl1, cc_fun = tc1
1099                                , cc_tyargs = args1, cc_rhs = xi1 }) 
1100            workItem@(CFunEqCan { cc_id = cv2, cc_flavor = fl2, cc_fun = tc2
1101                                , cc_tyargs = args2, cc_rhs = xi2 })
1102   | fl1 `canSolve` fl2 && lhss_match
1103   = do { cans <- rewriteEqLHS LeftComesFromInert  (mkCoVarCoercion cv1,xi1) (cv2,fl2,xi2) 
1104        ; mkIRStopK "FunEq/FunEq" cans } 
1105   | fl2 `canSolve` fl1 && lhss_match
1106   = do { cans <- rewriteEqLHS RightComesFromInert (mkCoVarCoercion cv2,xi2) (cv1,fl1,xi1) 
1107        ; mkIRContinue "FunEq/FunEq" workItem DropInert cans }
1108   where
1109     lhss_match = tc1 == tc2 && and (zipWith tcEqType args1 args2) 
1110
1111 doInteractWithInert (CTyEqCan { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 }) 
1112            workItem@(CTyEqCan { cc_id = cv2, cc_flavor = fl2, cc_tyvar = tv2, cc_rhs = xi2 })
1113 -- Check for matching LHS 
1114   | fl1 `canSolve` fl2 && tv1 == tv2 
1115   = do { cans <- rewriteEqLHS LeftComesFromInert (mkCoVarCoercion cv1,xi1) (cv2,fl2,xi2) 
1116        ; mkIRStopK "Eq/Eq lhs" cans } 
1117
1118   | fl2 `canSolve` fl1 && tv1 == tv2 
1119   = do { cans <- rewriteEqLHS RightComesFromInert (mkCoVarCoercion cv2,xi2) (cv1,fl1,xi1) 
1120        ; mkIRContinue "Eq/Eq lhs" workItem DropInert cans }
1121
1122 -- Check for rewriting RHS 
1123   | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfType xi2 
1124   = do { rewritten_eq <- rewriteEqRHS (cv1,tv1,xi1) (cv2,fl2,tv2,xi2) 
1125        ; mkIRStopK "Eq/Eq rhs" rewritten_eq }
1126
1127   | fl2 `canRewrite` fl1 && tv2 `elemVarSet` tyVarsOfType xi1
1128   = do { rewritten_eq <- rewriteEqRHS (cv2,tv2,xi2) (cv1,fl1,tv1,xi1) 
1129        ; mkIRContinue "Eq/Eq rhs" workItem DropInert rewritten_eq } 
1130
1131 doInteractWithInert (CTyEqCan   { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 })
1132                     (CFrozenErr { cc_id = cv2, cc_flavor = fl2 })
1133   | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfEvVar cv2
1134   = do { rewritten_frozen <- rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1135        ; mkIRStopK "Frozen/Eq" rewritten_frozen }
1136
1137 doInteractWithInert (CFrozenErr { cc_id = cv2, cc_flavor = fl2 })
1138            workItem@(CTyEqCan   { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 })
1139   | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfEvVar cv2
1140   = do { rewritten_frozen <- rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1141        ; mkIRContinue "Frozen/Eq" workItem DropInert rewritten_frozen }
1142
1143 -- Fall-through case for all other situations
1144 doInteractWithInert _ workItem = noInteraction workItem
1145
1146 -------------------------
1147 -- Equational Rewriting 
1148 rewriteDict  :: (CoVar, TcTyVar, Xi) -> (DictId, CtFlavor, Class, [Xi]) -> TcS CanonicalCt
1149 rewriteDict (cv,tv,xi) (dv,gw,cl,xis) 
1150   = do { let cos  = substTysWith [tv] [mkCoVarCoercion cv] xis -- xis[tv] ~ xis[xi]
1151              args = substTysWith [tv] [xi] xis
1152              con  = classTyCon cl 
1153              dict_co = mkTyConCoercion con cos 
1154        ; dv' <- newDictVar cl args 
1155        ; case gw of 
1156            Wanted {}         -> setDictBind dv (EvCast dv' (mkSymCoercion dict_co))
1157            Given {}          -> setDictBind dv' (EvCast dv dict_co) 
1158            Derived {}        -> return () -- Derived dicts we don't set any evidence
1159
1160        ; return (CDictCan { cc_id = dv'
1161                           , cc_flavor = gw 
1162                           , cc_class = cl 
1163                           , cc_tyargs = args }) } 
1164
1165 rewriteIP :: (CoVar,TcTyVar,Xi) -> (EvVar,CtFlavor, IPName Name, TcType) -> TcS CanonicalCt 
1166 rewriteIP (cv,tv,xi) (ipid,gw,nm,ty) 
1167   = do { let ip_co = substTyWith [tv] [mkCoVarCoercion cv] ty     -- ty[tv] ~ t[xi] 
1168              ty'   = substTyWith [tv] [xi] ty
1169        ; ipid' <- newIPVar nm ty' 
1170        ; case gw of 
1171            Wanted {}         -> setIPBind ipid  (EvCast ipid' (mkSymCoercion ip_co))
1172            Given {}          -> setIPBind ipid' (EvCast ipid ip_co) 
1173            Derived {}        -> return () -- Derived ips: we don't set any evidence
1174
1175        ; return (CIPCan { cc_id = ipid'
1176                         , cc_flavor = gw
1177                         , cc_ip_nm = nm
1178                         , cc_ip_ty = ty' }) }
1179    
1180 rewriteFunEq :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor,TyCon, [Xi], Xi) -> TcS CanonicalCt
1181 rewriteFunEq (cv1,tv,xi1) (cv2,gw, tc,args,xi2)                   -- cv2 :: F args ~ xi2
1182   = do { let arg_cos = substTysWith [tv] [mkCoVarCoercion cv1] args 
1183              args'   = substTysWith [tv] [xi1] args 
1184              fun_co  = mkTyConCoercion tc arg_cos                 -- fun_co :: F args ~ F args'
1185
1186              xi2'    = substTyWith [tv] [xi1] xi2
1187              xi2_co  = substTyWith [tv] [mkCoVarCoercion cv1] xi2 -- xi2_co :: xi2 ~ xi2' 
1188
1189        ; cv2' <- newCoVar (mkTyConApp tc args') xi2'
1190        ; case gw of 
1191            Wanted {} -> setCoBind cv2  (fun_co               `mkTransCoercion` 
1192                                         mkCoVarCoercion cv2' `mkTransCoercion` 
1193                                         mkSymCoercion xi2_co)
1194            Given {}  -> setCoBind cv2' (mkSymCoercion fun_co `mkTransCoercion` 
1195                                         mkCoVarCoercion cv2  `mkTransCoercion` 
1196                                         xi2_co)
1197            Derived {} -> return () 
1198
1199        ; return (CFunEqCan { cc_id = cv2'
1200                            , cc_flavor = gw
1201                            , cc_tyargs = args'
1202                            , cc_fun = tc 
1203                            , cc_rhs = xi2' }) }
1204
1205
1206 rewriteEqRHS :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor,TcTyVar,Xi) -> TcS WorkList
1207 -- Use the first equality to rewrite the second, flavors already checked. 
1208 -- E.g.          c1 : tv1 ~ xi1   c2 : tv2 ~ xi2
1209 -- rewrites c2 to give
1210 --               c2' : tv2 ~ xi2[xi1/tv1]
1211 -- We must do an occurs check to sure the new constraint is canonical
1212 -- So we might return an empty bag
1213 rewriteEqRHS (cv1,tv1,xi1) (cv2,gw,tv2,xi2) 
1214   | Just tv2' <- tcGetTyVar_maybe xi2'
1215   , tv2 == tv2'  -- In this case xi2[xi1/tv1] = tv2, so we have tv2~tv2
1216   = do { when (isWanted gw) (setCoBind cv2 (mkSymCoercion co2')) 
1217        ; return emptyCCan } 
1218   | otherwise
1219   = do { cv2' <- newCoVar (mkTyVarTy tv2) xi2'
1220        ; case gw of
1221              Wanted {} -> setCoBind cv2 $ mkCoVarCoercion cv2' `mkTransCoercion` 
1222                                           mkSymCoercion co2'
1223              Given {}  -> setCoBind cv2' $ mkCoVarCoercion cv2 `mkTransCoercion` 
1224                                            co2'
1225              Derived {} -> return ()
1226        ; canEq gw cv2' (mkTyVarTy tv2) xi2' }
1227   where 
1228     xi2' = substTyWith [tv1] [xi1] xi2 
1229     co2' = substTyWith [tv1] [mkCoVarCoercion cv1] xi2  -- xi2 ~ xi2[xi1/tv1]
1230
1231 rewriteEqLHS :: WhichComesFromInert -> (Coercion,Xi) -> (CoVar,CtFlavor,Xi) -> TcS WorkList
1232 -- Used to ineract two equalities of the following form: 
1233 -- First Equality:   co1: (XXX ~ xi1)  
1234 -- Second Equality:  cv2: (XXX ~ xi2) 
1235 -- Where the cv1 `canRewrite` cv2 equality 
1236 -- We have an option of creating new work (xi1 ~ xi2) OR (xi2 ~ xi1), 
1237 --    See Note [Efficient Orientation] for that 
1238 rewriteEqLHS LeftComesFromInert (co1,xi1) (cv2,gw,xi2) 
1239   = do { cv2' <- newCoVar xi2 xi1 
1240        ; case gw of 
1241            Wanted {} -> setCoBind cv2 $ 
1242                         co1 `mkTransCoercion` mkSymCoercion (mkCoVarCoercion cv2')
1243            Given {}  -> setCoBind cv2' $ 
1244                         mkSymCoercion (mkCoVarCoercion cv2) `mkTransCoercion` co1 
1245            Derived {} -> return ()
1246        ; mkCanonical gw cv2' }
1247
1248 rewriteEqLHS RightComesFromInert (co1,xi1) (cv2,gw,xi2) 
1249   = do { cv2' <- newCoVar xi1 xi2
1250        ; case gw of
1251            Wanted {} -> setCoBind cv2 $
1252                         co1 `mkTransCoercion` mkCoVarCoercion cv2'
1253            Given {}  -> setCoBind cv2' $
1254                         mkSymCoercion co1 `mkTransCoercion` mkCoVarCoercion cv2
1255            Derived {} -> return ()
1256        ; mkCanonical gw cv2' }
1257
1258 rewriteFrozen :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor) -> TcS WorkList
1259 rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1260   = do { cv2' <- newCoVar ty2a' ty2b'  -- ty2a[xi1/tv1] ~ ty2b[xi1/tv1]
1261        ; case fl2 of
1262              Wanted {} -> setCoBind cv2 $ co2a'                `mkTransCoercion`
1263                                           mkCoVarCoercion cv2' `mkTransCoercion`
1264                                           mkSymCoercion co2b'
1265
1266              Given {} -> setCoBind cv2' $ mkSymCoercion co2a'  `mkTransCoercion`
1267                                           mkCoVarCoercion cv2  `mkTransCoercion`
1268                                           co2b'
1269
1270              Derived {} -> return ()
1271
1272       ; return (singleCCan $ CFrozenErr { cc_id = cv2', cc_flavor = fl2 }) }
1273   where
1274     (ty2a, ty2b) = coVarKind cv2          -- cv2 : ty2a ~ ty2b
1275     ty2a' = substTyWith [tv1] [xi1] ty2a
1276     ty2b' = substTyWith [tv1] [xi1] ty2b
1277
1278     co2a' = substTyWith [tv1] [mkCoVarCoercion cv1] ty2a  -- ty2a ~ ty2a[xi1/tv1]
1279     co2b' = substTyWith [tv1] [mkCoVarCoercion cv1] ty2b  -- ty2b ~ ty2b[xi1/tv1]
1280
1281 solveOneFromTheOther :: String -> (EvTerm, CtFlavor) -> CanonicalCt -> TcS InteractResult
1282 -- First argument inert, second argument work-item. They both represent 
1283 -- wanted/given/derived evidence for the *same* predicate so 
1284 -- we can discharge one directly from the other. 
1285 --
1286 -- Precondition: value evidence only (implicit parameters, classes) 
1287 --               not coercion
1288 solveOneFromTheOther info (ev_term,ifl) workItem
1289   | isDerived wfl
1290   = mkIRStopK ("Solved[DW] " ++ info) emptyWorkList
1291
1292   | isDerived ifl -- The inert item is Derived, we can just throw it away, 
1293                   -- The workItem is inert wrt earlier inert-set items, 
1294                   -- so it's safe to continue on from this point
1295   = mkIRContinue ("Solved[DI] " ++ info) workItem DropInert emptyWorkList
1296   
1297   | otherwise
1298   = ASSERT( ifl `canSolve` wfl )
1299       -- Because of Note [The Solver Invariant], plus Derived dealt with
1300     do { when (isWanted wfl) $ setEvBind wid ev_term
1301            -- Overwrite the binding, if one exists
1302            -- If both are Given, we already have evidence; no need to duplicate
1303        ; mkIRStopK ("Solved " ++ info) emptyWorkList }
1304   where 
1305      wfl = cc_flavor workItem
1306      wid = cc_id workItem
1307 \end{code}
1308
1309 Note [Superclasses and recursive dictionaries]
1310 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1311     Overlaps with Note [SUPERCLASS-LOOP 1]
1312                   Note [SUPERCLASS-LOOP 2]
1313                   Note [Recursive instances and superclases]
1314     ToDo: check overlap and delete redundant stuff
1315
1316 Right before adding a given into the inert set, we must
1317 produce some more work, that will bring the superclasses 
1318 of the given into scope. The superclass constraints go into 
1319 our worklist. 
1320
1321 When we simplify a wanted constraint, if we first see a matching
1322 instance, we may produce new wanted work. To (1) avoid doing this work 
1323 twice in the future and (2) to handle recursive dictionaries we may ``cache'' 
1324 this item as given into our inert set WITHOUT adding its superclass constraints, 
1325 otherwise we'd be in danger of creating a loop [In fact this was the exact reason
1326 for doing the isGoodRecEv check in an older version of the type checker]. 
1327
1328 But now we have added partially solved constraints to the worklist which may 
1329 interact with other wanteds. Consider the example: 
1330
1331 Example 1: 
1332
1333     class Eq b => Foo a b        --- 0-th selector
1334     instance Eq a => Foo [a] a   --- fooDFun
1335
1336 and wanted (Foo [t] t). We are first going to see that the instance matches 
1337 and create an inert set that includes the solved (Foo [t] t) but not its superclasses:
1338        d1 :_g Foo [t] t                 d1 := EvDFunApp fooDFun d3 
1339 Our work list is going to contain a new *wanted* goal
1340        d3 :_w Eq t 
1341
1342 Ok, so how do we get recursive dictionaries, at all: 
1343
1344 Example 2:
1345
1346     data D r = ZeroD | SuccD (r (D r));
1347     
1348     instance (Eq (r (D r))) => Eq (D r) where
1349         ZeroD     == ZeroD     = True
1350         (SuccD a) == (SuccD b) = a == b
1351         _         == _         = False;
1352     
1353     equalDC :: D [] -> D [] -> Bool;
1354     equalDC = (==);
1355
1356 We need to prove (Eq (D [])). Here's how we go:
1357
1358         d1 :_w Eq (D [])
1359
1360 by instance decl, holds if
1361         d2 :_w Eq [D []]
1362         where   d1 = dfEqD d2
1363
1364 *BUT* we have an inert set which gives us (no superclasses): 
1365         d1 :_g Eq (D []) 
1366 By the instance declaration of Eq we can show the 'd2' goal if 
1367         d3 :_w Eq (D [])
1368         where   d2 = dfEqList d3
1369                 d1 = dfEqD d2
1370 Now, however this wanted can interact with our inert d1 to set: 
1371         d3 := d1 
1372 and solve the goal. Why was this interaction OK? Because, if we chase the 
1373 evidence of d1 ~~> dfEqD d2 ~~-> dfEqList d3, so by setting d3 := d1 we 
1374 are really setting
1375         d3 := dfEqD2 (dfEqList d3) 
1376 which is FINE because the use of d3 is protected by the instance function 
1377 applications. 
1378
1379 So, our strategy is to try to put solved wanted dictionaries into the
1380 inert set along with their superclasses (when this is meaningful,
1381 i.e. when new wanted goals are generated) but solve a wanted dictionary
1382 from a given only in the case where the evidence variable of the
1383 wanted is mentioned in the evidence of the given (recursively through
1384 the evidence binds) in a protected way: more instance function applications 
1385 than superclass selectors.
1386
1387 Here are some more examples from GHC's previous type checker
1388
1389
1390 Example 3: 
1391 This code arises in the context of "Scrap Your Boilerplate with Class"
1392
1393     class Sat a
1394     class Data ctx a
1395     instance  Sat (ctx Char)             => Data ctx Char       -- dfunData1
1396     instance (Sat (ctx [a]), Data ctx a) => Data ctx [a]        -- dfunData2
1397
1398     class Data Maybe a => Foo a    
1399
1400     instance Foo t => Sat (Maybe t)                             -- dfunSat
1401
1402     instance Data Maybe a => Foo a                              -- dfunFoo1
1403     instance Foo a        => Foo [a]                            -- dfunFoo2
1404     instance                 Foo [Char]                         -- dfunFoo3
1405
1406 Consider generating the superclasses of the instance declaration
1407          instance Foo a => Foo [a]
1408
1409 So our problem is this
1410     d0 :_g Foo t
1411     d1 :_w Data Maybe [t] 
1412
1413 We may add the given in the inert set, along with its superclasses
1414 [assuming we don't fail because there is a matching instance, see 
1415  tryTopReact, given case ]
1416   Inert:
1417     d0 :_g Foo t 
1418   WorkList 
1419     d01 :_g Data Maybe t  -- d2 := EvDictSuperClass d0 0 
1420     d1 :_w Data Maybe [t] 
1421 Then d2 can readily enter the inert, and we also do solving of the wanted
1422   Inert: 
1423     d0 :_g Foo t 
1424     d1 :_s Data Maybe [t]           d1 := dfunData2 d2 d3 
1425   WorkList
1426     d2 :_w Sat (Maybe [t])          
1427     d3 :_w Data Maybe t
1428     d01 :_g Data Maybe t 
1429 Now, we may simplify d2 more: 
1430   Inert:
1431       d0 :_g Foo t 
1432       d1 :_s Data Maybe [t]           d1 := dfunData2 d2 d3 
1433       d1 :_g Data Maybe [t] 
1434       d2 :_g Sat (Maybe [t])          d2 := dfunSat d4 
1435   WorkList: 
1436       d3 :_w Data Maybe t 
1437       d4 :_w Foo [t] 
1438       d01 :_g Data Maybe t 
1439
1440 Now, we can just solve d3.
1441   Inert
1442       d0 :_g Foo t 
1443       d1 :_s Data Maybe [t]           d1 := dfunData2 d2 d3 
1444       d2 :_g Sat (Maybe [t])          d2 := dfunSat d4 
1445   WorkList
1446       d4 :_w Foo [t] 
1447       d01 :_g Data Maybe t 
1448 And now we can simplify d4 again, but since it has superclasses we *add* them to the worklist:
1449   Inert
1450       d0 :_g Foo t 
1451       d1 :_s Data Maybe [t]           d1 := dfunData2 d2 d3 
1452       d2 :_g Sat (Maybe [t])          d2 := dfunSat d4 
1453       d4 :_g Foo [t]                  d4 := dfunFoo2 d5 
1454   WorkList:
1455       d5 :_w Foo t 
1456       d6 :_g Data Maybe [t]           d6 := EvDictSuperClass d4 0
1457       d01 :_g Data Maybe t 
1458 Now, d5 can be solved! (and its superclass enter scope) 
1459   Inert
1460       d0 :_g Foo t 
1461       d1 :_s Data Maybe [t]           d1 := dfunData2 d2 d3 
1462       d2 :_g Sat (Maybe [t])          d2 := dfunSat d4 
1463       d4 :_g Foo [t]                  d4 := dfunFoo2 d5 
1464       d5 :_g Foo t                    d5 := dfunFoo1 d7
1465   WorkList:
1466       d7 :_w Data Maybe t
1467       d6 :_g Data Maybe [t]
1468       d8 :_g Data Maybe t            d8 := EvDictSuperClass d5 0
1469       d01 :_g Data Maybe t 
1470
1471 Now, two problems: 
1472    [1] Suppose we pick d8 and we react him with d01. Which of the two givens should 
1473        we keep? Well, we *MUST NOT* drop d01 because d8 contains recursive evidence 
1474        that must not be used (look at case interactInert where both inert and workitem
1475        are givens). So we have several options: 
1476        - Drop the workitem always (this will drop d8)
1477               This feels very unsafe -- what if the work item was the "good" one
1478               that should be used later to solve another wanted?
1479        - Don't drop anyone: the inert set may contain multiple givens! 
1480               [This is currently implemented] 
1481
1482 The "don't drop anyone" seems the most safe thing to do, so now we come to problem 2: 
1483   [2] We have added both d6 and d01 in the inert set, and we are interacting our wanted
1484       d7. Now the [isRecDictEv] function in the ineration solver 
1485       [case inert-given workitem-wanted] will prevent us from interacting d7 := d8 
1486       precisely because chasing the evidence of d8 leads us to an unguarded use of d7. 
1487
1488       So, no interaction happens there. Then we meet d01 and there is no recursion 
1489       problem there [isRectDictEv] gives us the OK to interact and we do solve d7 := d01! 
1490              
1491 Note [SUPERCLASS-LOOP 1]
1492 ~~~~~~~~~~~~~~~~~~~~~~~~
1493 We have to be very, very careful when generating superclasses, lest we
1494 accidentally build a loop. Here's an example:
1495
1496   class S a
1497
1498   class S a => C a where { opc :: a -> a }
1499   class S b => D b where { opd :: b -> b }
1500   
1501   instance C Int where
1502      opc = opd
1503   
1504   instance D Int where
1505      opd = opc
1506
1507 From (instance C Int) we get the constraint set {ds1:S Int, dd:D Int}
1508 Simplifying, we may well get:
1509         $dfCInt = :C ds1 (opd dd)
1510         dd  = $dfDInt
1511         ds1 = $p1 dd
1512 Notice that we spot that we can extract ds1 from dd.  
1513
1514 Alas!  Alack! We can do the same for (instance D Int):
1515
1516         $dfDInt = :D ds2 (opc dc)
1517         dc  = $dfCInt
1518         ds2 = $p1 dc
1519
1520 And now we've defined the superclass in terms of itself.
1521 Two more nasty cases are in
1522         tcrun021
1523         tcrun033
1524
1525 Solution: 
1526   - Satisfy the superclass context *all by itself* 
1527     (tcSimplifySuperClasses)
1528   - And do so completely; i.e. no left-over constraints
1529     to mix with the constraints arising from method declarations
1530
1531
1532 Note [SUPERCLASS-LOOP 2]
1533 ~~~~~~~~~~~~~~~~~~~~~~~~
1534 We need to be careful when adding "the constaint we are trying to prove".
1535 Suppose we are *given* d1:Ord a, and want to deduce (d2:C [a]) where
1536
1537         class Ord a => C a where
1538         instance Ord [a] => C [a] where ...
1539
1540 Then we'll use the instance decl to deduce C [a] from Ord [a], and then add the
1541 superclasses of C [a] to avails.  But we must not overwrite the binding
1542 for Ord [a] (which is obtained from Ord a) with a superclass selection or we'll just
1543 build a loop! 
1544
1545 Here's another variant, immortalised in tcrun020
1546         class Monad m => C1 m
1547         class C1 m => C2 m x
1548         instance C2 Maybe Bool
1549 For the instance decl we need to build (C1 Maybe), and it's no good if
1550 we run around and add (C2 Maybe Bool) and its superclasses to the avails 
1551 before we search for C1 Maybe.
1552
1553 Here's another example 
1554         class Eq b => Foo a b
1555         instance Eq a => Foo [a] a
1556 If we are reducing
1557         (Foo [t] t)
1558
1559 we'll first deduce that it holds (via the instance decl).  We must not
1560 then overwrite the Eq t constraint with a superclass selection!
1561
1562 At first I had a gross hack, whereby I simply did not add superclass constraints
1563 in addWanted, though I did for addGiven and addIrred.  This was sub-optimal,
1564 becuase it lost legitimate superclass sharing, and it still didn't do the job:
1565 I found a very obscure program (now tcrun021) in which improvement meant the
1566 simplifier got two bites a the cherry... so something seemed to be an Stop
1567 first time, but reducible next time.
1568
1569 Now we implement the Right Solution, which is to check for loops directly 
1570 when adding superclasses.  It's a bit like the occurs check in unification.
1571
1572 Note [Recursive instances and superclases]
1573 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1574 Consider this code, which arises in the context of "Scrap Your 
1575 Boilerplate with Class".  
1576
1577     class Sat a
1578     class Data ctx a
1579     instance  Sat (ctx Char)             => Data ctx Char
1580     instance (Sat (ctx [a]), Data ctx a) => Data ctx [a]
1581
1582     class Data Maybe a => Foo a
1583
1584     instance Foo t => Sat (Maybe t)
1585
1586     instance Data Maybe a => Foo a
1587     instance Foo a        => Foo [a]
1588     instance                 Foo [Char]
1589
1590 In the instance for Foo [a], when generating evidence for the superclasses
1591 (ie in tcSimplifySuperClasses) we need a superclass (Data Maybe [a]).
1592 Using the instance for Data, we therefore need
1593         (Sat (Maybe [a], Data Maybe a)
1594 But we are given (Foo a), and hence its superclass (Data Maybe a).
1595 So that leaves (Sat (Maybe [a])).  Using the instance for Sat means
1596 we need (Foo [a]).  And that is the very dictionary we are bulding
1597 an instance for!  So we must put that in the "givens".  So in this
1598 case we have
1599         Given:  Foo a, Foo [a]
1600         Wanted: Data Maybe [a]
1601
1602 BUT we must *not not not* put the *superclasses* of (Foo [a]) in
1603 the givens, which is what 'addGiven' would normally do. Why? Because
1604 (Data Maybe [a]) is the superclass, so we'd "satisfy" the wanted 
1605 by selecting a superclass from Foo [a], which simply makes a loop.
1606
1607 On the other hand we *must* put the superclasses of (Foo a) in
1608 the givens, as you can see from the derivation described above.
1609
1610 Conclusion: in the very special case of tcSimplifySuperClasses
1611 we have one 'given' (namely the "this" dictionary) whose superclasses
1612 must not be added to 'givens' by addGiven.  
1613
1614 There is a complication though.  Suppose there are equalities
1615       instance (Eq a, a~b) => Num (a,b)
1616 Then we normalise the 'givens' wrt the equalities, so the original
1617 given "this" dictionary is cast to one of a different type.  So it's a
1618 bit trickier than before to identify the "special" dictionary whose
1619 superclasses must not be added. See test
1620    indexed-types/should_run/EqInInstance
1621
1622 We need a persistent property of the dictionary to record this
1623 special-ness.  Current I'm using the InstLocOrigin (a bit of a hack,
1624 but cool), which is maintained by dictionary normalisation.
1625 Specifically, the InstLocOrigin is
1626              NoScOrigin
1627 then the no-superclass thing kicks in.  WATCH OUT if you fiddle
1628 with InstLocOrigin!
1629
1630 Note [MATCHING-SYNONYMS]
1631 ~~~~~~~~~~~~~~~~~~~~~~~~
1632 When trying to match a dictionary (D tau) to a top-level instance, or a 
1633 type family equation (F taus_1 ~ tau_2) to a top-level family instance, 
1634 we do *not* need to expand type synonyms because the matcher will do that for us.
1635
1636
1637 Note [RHS-FAMILY-SYNONYMS] 
1638 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1639 The RHS of a family instance is represented as yet another constructor which is 
1640 like a type synonym for the real RHS the programmer declared. Eg: 
1641     type instance F (a,a) = [a] 
1642 Becomes: 
1643     :R32 a = [a]      -- internal type synonym introduced
1644     F (a,a) ~ :R32 a  -- instance 
1645
1646 When we react a family instance with a type family equation in the work list 
1647 we keep the synonym-using RHS without expansion. 
1648
1649
1650 *********************************************************************************
1651 *                                                                               * 
1652                        The top-reaction Stage
1653 *                                                                               *
1654 *********************************************************************************
1655
1656 \begin{code}
1657 -- If a work item has any form of interaction with top-level we get this 
1658 data TopInteractResult 
1659   = NoTopInt         -- No top-level interaction
1660                      -- Equivalent to (SomeTopInt emptyWorkList (ContinueWith work_item))
1661   | SomeTopInt 
1662       { tir_new_work  :: WorkList       -- Sub-goals or new work (could be given, 
1663                                         --                        for superclasses)
1664       , tir_new_inert :: StopOrContinue -- The input work item, ready to become *inert* now: 
1665       }                                 -- NB: in ``given'' (solved) form if the 
1666                                         -- original was wanted or given and instance match
1667                                         -- was found, but may also be in wanted form if we 
1668                                         -- only reacted with functional dependencies 
1669                                         -- arising from top-level instances.
1670
1671 topReactionsStage :: SimplifierStage 
1672 topReactionsStage depth workItem inerts 
1673   = do { tir <- tryTopReact workItem 
1674        ; case tir of 
1675            NoTopInt -> 
1676                return $ SR { sr_inerts   = inerts 
1677                            , sr_new_work = emptyWorkList 
1678                            , sr_stop     = ContinueWith workItem } 
1679            SomeTopInt tir_new_work tir_new_inert -> 
1680                do { bumpStepCountTcS
1681                   ; traceFireTcS depth (ptext (sLit "Top react")
1682                        <+> vcat [ ptext (sLit "Work =") <+> ppr workItem
1683                                 , ptext (sLit "New =") <+> ppr tir_new_work ])
1684                   ; return $ SR { sr_inerts   = inerts 
1685                                 , sr_new_work = tir_new_work
1686                                 , sr_stop     = tir_new_inert
1687                                 } }
1688        }
1689
1690 tryTopReact :: WorkItem -> TcS TopInteractResult 
1691 tryTopReact workitem 
1692   = do {  -- A flag controls the amount of interaction allowed
1693           -- See Note [Simplifying RULE lhs constraints]
1694          ctxt <- getTcSContext
1695        ; if allowedTopReaction (simplEqsOnly ctxt) workitem 
1696          then do { traceTcS "tryTopReact / calling doTopReact" (ppr workitem)
1697                  ; doTopReact workitem }
1698          else return NoTopInt 
1699        } 
1700
1701 allowedTopReaction :: Bool -> WorkItem -> Bool
1702 allowedTopReaction eqs_only (CDictCan {}) = not eqs_only
1703 allowedTopReaction _        _             = True
1704
1705 doTopReact :: WorkItem -> TcS TopInteractResult 
1706 -- The work item does not react with the inert set, so try interaction with top-level instances
1707 -- NB: The place to add superclasses in *not* in doTopReact stage. Instead superclasses are 
1708 --     added in the worklist as part of the canonicalisation process. 
1709 -- See Note [Adding superclasses] in TcCanonical.
1710
1711 -- Given dictionary
1712 -- See Note [Given constraint that matches an instance declaration]
1713 doTopReact (CDictCan { cc_flavor = Given {} })
1714   = return NoTopInt -- NB: Superclasses already added since it's canonical
1715
1716 -- Derived dictionary: just look for functional dependencies
1717 doTopReact workItem@(CDictCan { cc_flavor = fl@(Derived loc)
1718                               , cc_class = cls, cc_tyargs = xis })
1719   = do { instEnvs <- getInstEnvs
1720        ; let fd_eqns = improveFromInstEnv instEnvs
1721                                                 (ClassP cls xis, pprArisingAt loc)
1722        ; m <- rewriteWithFunDeps fd_eqns xis fl
1723        ; case m of
1724            Nothing -> return NoTopInt
1725            Just (xis',_,fd_work) ->
1726                let workItem' = workItem { cc_tyargs = xis' }
1727                    -- Deriveds are not supposed to have identity (cc_id is unused!)
1728                in return $ SomeTopInt { tir_new_work  = fd_work 
1729                                       , tir_new_inert = ContinueWith workItem' } }
1730
1731 -- Wanted dictionary
1732 doTopReact workItem@(CDictCan { cc_id = dv, cc_flavor = fl@(Wanted loc)
1733                               , cc_class = cls, cc_tyargs = xis })
1734   = do { -- See Note [MATCHING-SYNONYMS]
1735        ; lkp_inst_res <- matchClassInst cls xis loc
1736        ; case lkp_inst_res of
1737            NoInstance ->
1738              do { traceTcS "doTopReact/ no class instance for" (ppr dv)
1739
1740                 ; instEnvs <- getInstEnvs
1741                 ; let fd_eqns = improveFromInstEnv instEnvs
1742                                                          (ClassP cls xis, pprArisingAt loc)
1743                 ; m <- rewriteWithFunDeps fd_eqns xis fl
1744                 ; case m of
1745                     Nothing -> return NoTopInt
1746                     Just (xis',cos,fd_work) ->
1747                         do { let dict_co = mkTyConCoercion (classTyCon cls) cos
1748                            ; dv'<- newDictVar cls xis'
1749                            ; setDictBind dv (EvCast dv' dict_co)
1750                            ; let workItem' = CDictCan { cc_id = dv', cc_flavor = fl, 
1751                                                         cc_class = cls, cc_tyargs = xis' }
1752                            ; return $ 
1753                              SomeTopInt { tir_new_work  = singleCCan workItem' `andCCan` fd_work
1754                                         , tir_new_inert = Stop } } }
1755
1756            GenInst wtvs ev_term -- Solved 
1757                    -- No need to do fundeps stuff here; the instance 
1758                    -- matches already so we won't get any more info
1759                    -- from functional dependencies
1760              | null wtvs
1761              -> do { traceTcS "doTopReact/ found nullary class instance for" (ppr dv) 
1762                    ; setDictBind dv ev_term 
1763                     -- Solved in one step and no new wanted work produced. 
1764                     -- i.e we directly matched a top-level instance
1765                     -- No point in caching this in 'inert'; hence Stop
1766                    ; return $ SomeTopInt { tir_new_work  = emptyWorkList 
1767                                          , tir_new_inert = Stop } }
1768
1769              | otherwise
1770              -> do { traceTcS "doTopReact/ found nullary class instance for" (ppr dv) 
1771                    ; setDictBind dv ev_term 
1772                         -- Solved and new wanted work produced, you may cache the 
1773                         -- (tentatively solved) dictionary as Given! (used to be: Derived)
1774                    ; let solved   = workItem { cc_flavor = given_fl }
1775                          given_fl = Given (setCtLocOrigin loc UnkSkol) 
1776                    ; inst_work <- canWanteds wtvs
1777                    ; return $ SomeTopInt { tir_new_work  = inst_work
1778                                          , tir_new_inert = ContinueWith solved } }
1779        }          
1780
1781 -- Type functions
1782 doTopReact (CFunEqCan { cc_id = cv, cc_flavor = fl
1783                       , cc_fun = tc, cc_tyargs = args, cc_rhs = xi })
1784   = ASSERT (isSynFamilyTyCon tc)   -- No associated data families have reached that far 
1785     do { match_res <- matchFam tc args -- See Note [MATCHING-SYNONYMS]
1786        ; case match_res of 
1787            MatchInstNo 
1788              -> return NoTopInt 
1789            MatchInstSingle (rep_tc, rep_tys)
1790              -> do { let Just coe_tc = tyConFamilyCoercion_maybe rep_tc
1791                          Just rhs_ty = tcView (mkTyConApp rep_tc rep_tys)
1792                             -- Eagerly expand away the type synonym on the
1793                             -- RHS of a type function, so that it never
1794                             -- appears in an error message
1795                             -- See Note [Type synonym families] in TyCon
1796                          coe = mkTyConApp coe_tc rep_tys 
1797                    ; cv' <- case fl of
1798                               Wanted {} -> do { cv' <- newCoVar rhs_ty xi
1799                                               ; setCoBind cv $ 
1800                                                     coe `mkTransCoercion`
1801                                                       mkCoVarCoercion cv'
1802                                               ; return cv' }
1803                               Given {}   -> newGivenCoVar xi rhs_ty $ 
1804                                             mkSymCoercion (mkCoVarCoercion cv) `mkTransCoercion` coe 
1805                               Derived {} -> newDerivedId (EqPred xi rhs_ty)
1806                    ; can_cts <- mkCanonical fl cv'
1807                    ; return $ SomeTopInt can_cts Stop }
1808            _ 
1809              -> panicTcS $ text "TcSMonad.matchFam returned multiple instances!"
1810        }
1811
1812
1813 -- Any other work item does not react with any top-level equations
1814 doTopReact _workItem = return NoTopInt 
1815 \end{code}
1816
1817
1818 Note [FunDep and implicit parameter reactions] 
1819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1820 Currently, our story of interacting two dictionaries (or a dictionary
1821 and top-level instances) for functional dependencies, and implicit
1822 paramters, is that we simply produce new wanted equalities.  So for example
1823
1824         class D a b | a -> b where ... 
1825     Inert: 
1826         d1 :g D Int Bool
1827     WorkItem: 
1828         d2 :w D Int alpha
1829
1830     We generate the extra work item
1831         cv :w alpha ~ Bool
1832     where 'cv' is currently unused.  However, this new item reacts with d2,
1833     discharging it in favour of a new constraint d2' thus:
1834         d2' :w D Int Bool
1835         d2 := d2' |> D Int cv
1836     Now d2' can be discharged from d1
1837
1838 We could be more aggressive and try to *immediately* solve the dictionary 
1839 using those extra equalities. With the same inert set and work item we
1840 might dischard d2 directly:
1841
1842         cv :w alpha ~ Bool
1843         d2 := d1 |> D Int cv
1844
1845 But in general it's a bit painful to figure out the necessary coercion,
1846 so we just take the first approach. Here is a better example. Consider:
1847     class C a b c | a -> b 
1848 And: 
1849      [Given]  d1 : C T Int Char 
1850      [Wanted] d2 : C T beta Int 
1851 In this case, it's *not even possible* to solve the wanted immediately. 
1852 So we should simply output the functional dependency and add this guy
1853 [but NOT its superclasses] back in the worklist. Even worse: 
1854      [Given] d1 : C T Int beta 
1855      [Wanted] d2: C T beta Int 
1856 Then it is solvable, but its very hard to detect this on the spot. 
1857
1858 It's exactly the same with implicit parameters, except that the
1859 "aggressive" approach would be much easier to implement.
1860
1861 Note [When improvement happens]
1862 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1863 We fire an improvement rule when
1864
1865   * Two constraints match (modulo the fundep)
1866       e.g. C t1 t2, C t1 t3    where C a b | a->b
1867     The two match because the first arg is identical
1868
1869   * At least one is not Given.  If they are both given, we don't fire
1870     the reaction because we have no way of constructing evidence for a
1871     new equality nor does it seem right to create a new wanted goal
1872     (because the goal will most likely contain untouchables, which
1873     can't be solved anyway)!
1874    
1875 Note that we *do* fire the improvement if one is Given and one is Derived.
1876 The latter can be a superclass of a wanted goal. Example (tcfail138)
1877     class L a b | a -> b
1878     class (G a, L a b) => C a b
1879
1880     instance C a b' => G (Maybe a)
1881     instance C a b  => C (Maybe a) a
1882     instance L (Maybe a) a
1883
1884 When solving the superclasses of the (C (Maybe a) a) instance, we get
1885   Given:  C a b  ... and hance by superclasses, (G a, L a b)
1886   Wanted: G (Maybe a)
1887 Use the instance decl to get
1888   Wanted: C a b'
1889 The (C a b') is inert, so we generate its Derived superclasses (L a b'),
1890 and now we need improvement between that derived superclass an the Given (L a b)
1891
1892 Note [Overriding implicit parameters]
1893 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1894 Consider
1895    f :: (?x::a) -> Bool -> a
1896   
1897    g v = let ?x::Int = 3 
1898          in (f v, let ?x::Bool = True in f v)
1899
1900 This should probably be well typed, with
1901    g :: Bool -> (Int, Bool)
1902
1903 So the inner binding for ?x::Bool *overrides* the outer one.
1904 Hence a work-item Given overrides an inert-item Given.
1905
1906 Note [Given constraint that matches an instance declaration]
1907 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1908 What should we do when we discover that one (or more) top-level 
1909 instances match a given (or solved) class constraint? We have 
1910 two possibilities:
1911
1912   1. Reject the program. The reason is that there may not be a unique
1913      best strategy for the solver. Example, from the OutsideIn(X) paper:
1914        instance P x => Q [x] 
1915        instance (x ~ y) => R [x] y 
1916      
1917        wob :: forall a b. (Q [b], R b a) => a -> Int 
1918
1919        g :: forall a. Q [a] => [a] -> Int 
1920        g x = wob x 
1921
1922        will generate the impliation constraint: 
1923             Q [a] => (Q [beta], R beta [a]) 
1924        If we react (Q [beta]) with its top-level axiom, we end up with a 
1925        (P beta), which we have no way of discharging. On the other hand, 
1926        if we react R beta [a] with the top-level we get  (beta ~ a), which 
1927        is solvable and can help us rewrite (Q [beta]) to (Q [a]) which is 
1928        now solvable by the given Q [a]. 
1929  
1930      However, this option is restrictive, for instance [Example 3] from 
1931      Note [Recursive dictionaries] will fail to work. 
1932
1933   2. Ignore the problem, hoping that the situations where there exist indeed
1934      such multiple strategies are rare: Indeed the cause of the previous 
1935      problem is that (R [x] y) yields the new work (x ~ y) which can be 
1936      *spontaneously* solved, not using the givens. 
1937
1938 We are choosing option 2 below but we might consider having a flag as well.
1939
1940
1941 Note [New Wanted Superclass Work] 
1942 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1943 Even in the case of wanted constraints, we may add some superclasses 
1944 as new given work. The reason is: 
1945
1946         To allow FD-like improvement for type families. Assume that 
1947         we have a class 
1948              class C a b | a -> b 
1949         and we have to solve the implication constraint: 
1950              C a b => C a beta 
1951         Then, FD improvement can help us to produce a new wanted (beta ~ b) 
1952
1953         We want to have the same effect with the type family encoding of 
1954         functional dependencies. Namely, consider: 
1955              class (F a ~ b) => C a b 
1956         Now suppose that we have: 
1957                given: C a b 
1958                wanted: C a beta 
1959         By interacting the given we will get given (F a ~ b) which is not 
1960         enough by itself to make us discharge (C a beta). However, we 
1961         may create a new derived equality from the super-class of the
1962         wanted constraint (C a beta), namely derived (F a ~ beta). 
1963         Now we may interact this with given (F a ~ b) to get: 
1964                   derived :  beta ~ b 
1965         But 'beta' is a touchable unification variable, and hence OK to 
1966         unify it with 'b', replacing the derived evidence with the identity. 
1967
1968         This requires trySpontaneousSolve to solve *derived*
1969         equalities that have a touchable in their RHS, *in addition*
1970         to solving wanted equalities.
1971
1972 We also need to somehow use the superclasses to quantify over a minimal, 
1973 constraint see note [Minimize by Superclasses] in TcSimplify.
1974
1975
1976 Finally, here is another example where this is useful. 
1977
1978 Example 1:
1979 ----------
1980    class (F a ~ b) => C a b 
1981 And we are given the wanteds:
1982       w1 : C a b 
1983       w2 : C a c 
1984       w3 : b ~ c 
1985 We surely do *not* want to quantify over (b ~ c), since if someone provides
1986 dictionaries for (C a b) and (C a c), these dictionaries can provide a proof 
1987 of (b ~ c), hence no extra evidence is necessary. Here is what will happen: 
1988
1989      Step 1: We will get new *given* superclass work, 
1990              provisionally to our solving of w1 and w2
1991              
1992                g1: F a ~ b, g2 : F a ~ c, 
1993                w1 : C a b, w2 : C a c, w3 : b ~ c
1994
1995              The evidence for g1 and g2 is a superclass evidence term: 
1996
1997                g1 := sc w1, g2 := sc w2
1998
1999      Step 2: The givens will solve the wanted w3, so that 
2000                w3 := sym (sc w1) ; sc w2 
2001                   
2002      Step 3: Now, one may naively assume that then w2 can be solve from w1
2003              after rewriting with the (now solved equality) (b ~ c). 
2004              
2005              But this rewriting is ruled out by the isGoodRectDict! 
2006
2007 Conclusion, we will (correctly) end up with the unsolved goals 
2008     (C a b, C a c)   
2009
2010 NB: The desugarer needs be more clever to deal with equalities 
2011     that participate in recursive dictionary bindings. 
2012
2013 \begin{code}
2014 data LookupInstResult
2015   = NoInstance
2016   | GenInst [WantedEvVar] EvTerm 
2017
2018 matchClassInst :: Class -> [Type] -> WantedLoc -> TcS LookupInstResult
2019 matchClassInst clas tys loc
2020    = do { let pred = mkClassPred clas tys 
2021         ; mb_result <- matchClass clas tys
2022         ; case mb_result of
2023             MatchInstNo   -> return NoInstance
2024             MatchInstMany -> return NoInstance -- defer any reactions of a multitude until 
2025                                                -- we learn more about the reagent 
2026             MatchInstSingle (dfun_id, mb_inst_tys) -> 
2027               do { checkWellStagedDFun pred dfun_id loc
2028
2029         -- It's possible that not all the tyvars are in
2030         -- the substitution, tenv. For example:
2031         --      instance C X a => D X where ...
2032         -- (presumably there's a functional dependency in class C)
2033         -- Hence mb_inst_tys :: Either TyVar TcType 
2034
2035                  ; tys <- instDFunTypes mb_inst_tys 
2036                  ; let (theta, _) = tcSplitPhiTy (applyTys (idType dfun_id) tys)
2037                  ; if null theta then
2038                        return (GenInst [] (EvDFunApp dfun_id tys []))
2039                    else do
2040                      { ev_vars <- instDFunConstraints theta
2041                      ; let wevs = [EvVarX w loc | w <- ev_vars]
2042                      ; return $ GenInst wevs (EvDFunApp dfun_id tys ev_vars) }
2043                  }
2044         }
2045 \end{code}