3 solveInteract, solveInteractGiven, solveInteractWanted,
4 AtomicInert, tyVarsOfInert,
5 InertSet, emptyInert, updInertSet, extractUnsolved, solveOne,
8 #include "HsVersions.h"
22 import Inst( tyVarsOfEvVar )
37 import qualified Data.Map as Map
39 import Control.Monad( when )
41 import FastString ( sLit )
45 Note [InertSet invariants]
46 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 An InertSet is a bag of canonical constraints, with the following invariants:
49 1 No two constraints react with each other.
51 A tricky case is when there exists a given (solved) dictionary
52 constraint and a wanted identical constraint in the inert set, but do
53 not react because reaction would create loopy dictionary evidence for
54 the wanted. See note [Recursive dictionaries]
56 2 Given equalities form an idempotent substitution [none of the
57 given LHS's occur in any of the given RHS's or reactant parts]
59 3 Wanted equalities also form an idempotent substitution
61 4 The entire set of equalities is acyclic.
63 5 Wanted dictionaries are inert with the top-level axiom set
65 6 Equalities of the form tv1 ~ tv2 always have a touchable variable
66 on the left (if possible).
68 7 No wanted constraints tv1 ~ tv2 with tv1 touchable. Such constraints
69 will be marked as solved right before being pushed into the inert set.
70 See note [Touchables and givens].
72 8 No Given constraint mentions a touchable unification variable,
75 Note that 6 and 7 are /not/ enforced by canonicalization but rather by
76 insertion in the inert list, ie by TcInteract.
78 During the process of solving, the inert set will contain some
79 previously given constraints, some wanted constraints, and some given
80 constraints which have arisen from solving wanted constraints. For
81 now we do not distinguish between given and solved constraints.
83 Note that we must switch wanted inert items to given when going under an
84 implication constraint (when in top-level inference mode).
88 data CCanMap a = CCanMap { cts_given :: Map.Map a CanonicalCts
89 -- Invariant: all Given
90 , cts_derived :: Map.Map a CanonicalCts
91 -- Invariant: all Derived
92 , cts_wanted :: Map.Map a CanonicalCts }
93 -- Invariant: all Wanted
95 cCanMapToBag :: Ord a => CCanMap a -> CanonicalCts
96 cCanMapToBag cmap = Map.fold unionBags rest_wder (cts_given cmap)
97 where rest_wder = Map.fold unionBags rest_der (cts_wanted cmap)
98 rest_der = Map.fold unionBags emptyCCan (cts_derived cmap)
100 emptyCCanMap :: CCanMap a
101 emptyCCanMap = CCanMap { cts_given = Map.empty
102 , cts_derived = Map.empty, cts_wanted = Map.empty }
104 updCCanMap:: Ord a => (a,CanonicalCt) -> CCanMap a -> CCanMap a
105 updCCanMap (a,ct) cmap
106 = case cc_flavor ct of
108 -> cmap { cts_wanted = Map.insertWith unionBags a this_ct (cts_wanted cmap) }
110 -> cmap { cts_given = Map.insertWith unionBags a this_ct (cts_given cmap) }
112 -> cmap { cts_derived = Map.insertWith unionBags a this_ct (cts_derived cmap) }
113 where this_ct = singleCCan ct
115 getRelevantCts :: Ord a => a -> CCanMap a -> (CanonicalCts, CCanMap a)
116 -- Gets the relevant constraints and returns the rest of the CCanMap
117 getRelevantCts a cmap
118 = let relevant = unionManyBags [ Map.findWithDefault emptyCCan a (cts_wanted cmap)
119 , Map.findWithDefault emptyCCan a (cts_given cmap)
120 , Map.findWithDefault emptyCCan a (cts_derived cmap) ]
121 residual_map = cmap { cts_wanted = Map.delete a (cts_wanted cmap)
122 , cts_given = Map.delete a (cts_given cmap)
123 , cts_derived = Map.delete a (cts_derived cmap) }
124 in (relevant, residual_map)
126 extractUnsolvedCMap :: Ord a => CCanMap a -> (CanonicalCts, CCanMap a)
127 -- Gets the wanted or derived constraints and returns a residual
128 -- CCanMap with only givens.
129 extractUnsolvedCMap cmap =
130 let wntd = Map.fold unionBags emptyCCan (cts_wanted cmap)
131 derd = Map.fold unionBags emptyCCan (cts_derived cmap)
132 in (wntd `unionBags` derd,
133 cmap { cts_wanted = Map.empty, cts_derived = Map.empty })
136 -- See Note [InertSet invariants]
138 = IS { inert_eqs :: CanonicalCts -- Equalities only (CTyEqCan)
139 , inert_dicts :: CCanMap Class -- Dictionaries only
140 , inert_ips :: CCanMap (IPName Name) -- Implicit parameters
141 , inert_frozen :: CanonicalCts
142 , inert_funeqs :: CCanMap TyCon -- Type family equalities only
143 -- This representation allows us to quickly get to the relevant
144 -- inert constraints when interacting a work item with the inert set.
147 tyVarsOfInert :: InertSet -> TcTyVarSet
148 tyVarsOfInert (IS { inert_eqs = eqs
149 , inert_dicts = dictmap
151 , inert_frozen = frozen
152 , inert_funeqs = funeqmap }) = tyVarsOfCanonicals cts
154 cts = eqs `andCCan` frozen `andCCan` cCanMapToBag dictmap
155 `andCCan` cCanMapToBag ipmap `andCCan` cCanMapToBag funeqmap
157 instance Outputable InertSet where
158 ppr is = vcat [ vcat (map ppr (Bag.bagToList $ inert_eqs is))
159 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_dicts is)))
160 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_ips is)))
161 , vcat (map ppr (Bag.bagToList $ cCanMapToBag (inert_funeqs is)))
162 , vcat (map ppr (Bag.bagToList $ inert_frozen is))
165 emptyInert :: InertSet
166 emptyInert = IS { inert_eqs = Bag.emptyBag
167 , inert_frozen = Bag.emptyBag
168 , inert_dicts = emptyCCanMap
169 , inert_ips = emptyCCanMap
170 , inert_funeqs = emptyCCanMap }
172 updInertSet :: InertSet -> AtomicInert -> InertSet
174 | isCTyEqCan item -- Other equality
175 = let eqs' = inert_eqs is `Bag.snocBag` item
176 in is { inert_eqs = eqs' }
177 | Just cls <- isCDictCan_Maybe item -- Dictionary
178 = is { inert_dicts = updCCanMap (cls,item) (inert_dicts is) }
179 | Just x <- isCIPCan_Maybe item -- IP
180 = is { inert_ips = updCCanMap (x,item) (inert_ips is) }
181 | Just tc <- isCFunEqCan_Maybe item -- Function equality
182 = is { inert_funeqs = updCCanMap (tc,item) (inert_funeqs is) }
184 = is { inert_frozen = inert_frozen is `Bag.snocBag` item }
186 extractUnsolved :: InertSet -> (InertSet, CanonicalCts)
187 -- Postcondition: the returned canonical cts are either Derived, or Wanted.
188 extractUnsolved is@(IS {inert_eqs = eqs})
189 = let is_solved = is { inert_eqs = solved_eqs
190 , inert_dicts = solved_dicts
191 , inert_ips = solved_ips
192 , inert_frozen = emptyCCan
193 , inert_funeqs = solved_funeqs }
194 in (is_solved, unsolved)
196 where (unsolved_eqs, solved_eqs) = Bag.partitionBag (not.isGivenCt) eqs
197 (unsolved_ips, solved_ips) = extractUnsolvedCMap (inert_ips is)
198 (unsolved_dicts, solved_dicts) = extractUnsolvedCMap (inert_dicts is)
199 (unsolved_funeqs, solved_funeqs) = extractUnsolvedCMap (inert_funeqs is)
201 unsolved = unsolved_eqs `unionBags` inert_frozen is `unionBags`
202 unsolved_ips `unionBags` unsolved_dicts `unionBags` unsolved_funeqs
205 %*********************************************************************
207 * Main Interaction Solver *
209 **********************************************************************
213 1. Canonicalise (unary)
214 2. Pairwise interaction (binary)
215 * Take one from work list
216 * Try all pair-wise interactions with each constraint in inert
218 As an optimisation, we prioritize the equalities both in the
219 worklist and in the inerts.
221 3. Try to solve spontaneously for equalities involving touchables
222 4. Top-level interaction (binary wrt top-level)
223 Superclass decomposition belongs in (4), see note [Superclasses]
226 type AtomicInert = CanonicalCt -- constraint pulled from InertSet
227 type WorkItem = CanonicalCt -- constraint pulled from WorkList
229 -- A mixture of Given, Wanted, and Derived constraints.
230 -- We split between equalities and the rest to process equalities first.
231 type WorkList = CanonicalCts
233 unionWorkLists :: WorkList -> WorkList -> WorkList
234 unionWorkLists = andCCan
236 isEmptyWorkList :: WorkList -> Bool
237 isEmptyWorkList = isEmptyCCan
239 emptyWorkList :: WorkList
240 emptyWorkList = emptyCCan
242 workListFromCCan :: CanonicalCt -> WorkList
243 workListFromCCan = singleCCan
245 ------------------------
247 = Stop -- Work item is consumed
248 | ContinueWith WorkItem -- Not consumed
250 instance Outputable StopOrContinue where
251 ppr Stop = ptext (sLit "Stop")
252 ppr (ContinueWith w) = ptext (sLit "ContinueWith") <+> ppr w
254 -- Results after interacting a WorkItem as far as possible with an InertSet
256 = SR { sr_inerts :: InertSet
257 -- The new InertSet to use (REPLACES the old InertSet)
258 , sr_new_work :: WorkList
259 -- Any new work items generated (should be ADDED to the old WorkList)
261 -- sr_stop = Just workitem => workitem is *not* in sr_inerts and
262 -- workitem is inert wrt to sr_inerts
263 , sr_stop :: StopOrContinue
266 instance Outputable StageResult where
267 ppr (SR { sr_inerts = inerts, sr_new_work = work, sr_stop = stop })
268 = ptext (sLit "SR") <+>
269 braces (sep [ ptext (sLit "inerts =") <+> ppr inerts <> comma
270 , ptext (sLit "new work =") <+> ppr work <> comma
271 , ptext (sLit "stop =") <+> ppr stop])
273 type SimplifierStage = WorkItem -> InertSet -> TcS StageResult
275 -- Combine a sequence of simplifier 'stages' to create a pipeline
276 runSolverPipeline :: [(String, SimplifierStage)]
277 -> InertSet -> WorkItem
278 -> TcS (InertSet, WorkList)
279 -- Precondition: non-empty list of stages
280 runSolverPipeline pipeline inerts workItem
281 = do { traceTcS "Start solver pipeline" $
282 vcat [ ptext (sLit "work item =") <+> ppr workItem
283 , ptext (sLit "inerts =") <+> ppr inerts]
285 ; let itr_in = SR { sr_inerts = inerts
286 , sr_new_work = emptyWorkList
287 , sr_stop = ContinueWith workItem }
288 ; itr_out <- run_pipeline pipeline itr_in
290 = case sr_stop itr_out of
291 Stop -> sr_inerts itr_out
292 ContinueWith item -> sr_inerts itr_out `updInertSet` item
293 ; return (new_inert, sr_new_work itr_out) }
295 run_pipeline :: [(String, SimplifierStage)]
296 -> StageResult -> TcS StageResult
297 run_pipeline [] itr = return itr
298 run_pipeline _ itr@(SR { sr_stop = Stop }) = return itr
300 run_pipeline ((name,stage):stages)
301 (SR { sr_new_work = accum_work
303 , sr_stop = ContinueWith work_item })
304 = do { itr <- stage work_item inerts
305 ; traceTcS ("Stage result (" ++ name ++ ")") (ppr itr)
306 ; let itr' = itr { sr_new_work = accum_work `unionWorkLists` sr_new_work itr }
307 ; run_pipeline stages itr' }
311 Inert: {c ~ d, F a ~ t, b ~ Int, a ~ ty} (all given)
312 Reagent: a ~ [b] (given)
314 React with (c~d) ==> IR (ContinueWith (a~[b])) True []
315 React with (F a ~ t) ==> IR (ContinueWith (a~[b])) False [F [b] ~ t]
316 React with (b ~ Int) ==> IR (ContinueWith (a~[Int]) True []
319 Inert: {c ~w d, F a ~g t, b ~w Int, a ~w ty}
322 React with (c ~w d) ==> IR (ContinueWith (a~[b])) True []
323 React with (F a ~g t) ==> IR (ContinueWith (a~[b])) True [] (can't rewrite given with wanted!)
327 Inert: {a ~ Int, F Int ~ b} (given)
328 Reagent: F a ~ b (wanted)
330 React with (a ~ Int) ==> IR (ContinueWith (F Int ~ b)) True []
331 React with (F Int ~ b) ==> IR Stop True [] -- after substituting we re-canonicalize and get nothing
334 -- Main interaction solver: we fully solve the worklist 'in one go',
335 -- returning an extended inert set.
337 -- See Note [Touchables and givens].
338 solveInteractGiven :: InertSet -> GivenLoc -> [EvVar] -> TcS InertSet
339 solveInteractGiven inert gloc evs
340 = do { (_, inert_ret) <- solveInteract inert $ listToBag $
345 mk_given ev = mkEvVarX ev flav
347 solveInteractWanted :: InertSet -> [WantedEvVar] -> TcS InertSet
348 solveInteractWanted inert wvs
349 = do { (_,inert_ret) <- solveInteract inert $ listToBag $
350 map wantedToFlavored wvs
353 solveInteract :: InertSet -> Bag FlavoredEvVar -> TcS (Bool, InertSet)
354 -- Post: (True, inert_set) means we managed to discharge all constraints
355 -- without actually doing any interactions!
356 -- (False, inert_set) means some interactions occurred
357 solveInteract inert ws
358 = do { dyn_flags <- getDynFlags
359 ; sctx <- getTcSContext
361 ; traceTcS "solveInteract, before clever canonicalization:" $
362 vcat [ text "ws = " <+> ppr (mapBag (\(EvVarX ev ct)
363 -> (ct,evVarPred ev)) ws)
364 , text "inert = " <+> ppr inert ]
366 ; (flag, inert_ret) <- foldlBagM (tryPreSolveAndInteract sctx dyn_flags) (True,inert) ws
368 ; traceTcS "solveInteract, after clever canonicalization (and interaction):" $
369 vcat [ text "No interaction happened = " <+> ppr flag
370 , text "inert_ret = " <+> ppr inert_ret ]
372 ; return (flag, inert_ret) }
375 tryPreSolveAndInteract :: SimplContext
379 -> TcS (Bool, InertSet)
380 -- Returns: True if it was able to discharge this constraint AND all previous ones
381 tryPreSolveAndInteract sctx dyn_flags (all_previous_discharged, inert)
382 flavev@(EvVarX ev_var fl)
383 = do { let inert_cts = get_inert_cts (evVarPred ev_var)
385 ; this_one_discharged <- dischargeFromCCans inert_cts flavev
387 ; if this_one_discharged
388 then return (all_previous_discharged, inert)
391 { extra_cts <- mkCanonical fl ev_var
392 ; inert_ret <- solveInteractWithDepth (ctxtStkDepth dyn_flags,0,[])
394 ; return (False, inert_ret) } }
397 get_inert_cts (ClassP clas _)
398 | simplEqsOnly sctx = emptyCCan
399 | otherwise = fst (getRelevantCts clas (inert_dicts inert))
400 get_inert_cts (IParam {})
401 = emptyCCan -- We must not do the same thing for IParams, because (contrary
402 -- to dictionaries), work items /must/ override inert items.
403 -- See Note [Overriding implicit parameters] in TcInteract.
404 get_inert_cts (EqPred {})
405 = inert_eqs inert `unionBags` cCanMapToBag (inert_funeqs inert)
407 dischargeFromCCans :: CanonicalCts -> FlavoredEvVar -> TcS Bool
408 dischargeFromCCans cans (EvVarX ev fl)
409 = Bag.foldlBagM discharge_ct False cans
410 where discharge_ct :: Bool -> CanonicalCt -> TcS Bool
411 discharge_ct True _ct = return True
412 discharge_ct False ct
413 | evVarPred (cc_id ct) `tcEqPred` evVarPred ev
414 , cc_flavor ct `canSolve` fl
415 = do { when (isWanted fl) $ set_ev_bind ev (cc_id ct)
417 where set_ev_bind x y
418 | EqPred {} <- evVarPred y
419 = setEvBind x (EvCoercion (mkCoVarCoercion y))
420 | otherwise = setEvBind x (EvId y)
421 discharge_ct False _ct = return False
424 Note [Avoiding the superclass explosion]
425 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
426 This note now is not as significant as it used to be because we no
427 longer add the superclasses of Wanted as Derived, except only if they
428 have equality superclasses or superclasses with functional
429 dependencies. The fear was that hundreds of identical wanteds would
430 give rise each to the same superclass or equality Derived's which
431 would lead to a blo-up in the number of interactions.
433 Instead, what we do with tryPreSolveAndCanon, is when we encounter a
434 new constraint, we very quickly see if it can be immediately
435 discharged by a class constraint in our inert set or the previous
436 canonicals. If so, we add nothing to the returned canonical
440 solveOne :: InertSet -> WorkItem -> TcS InertSet
441 solveOne inerts workItem
442 = do { dyn_flags <- getDynFlags
443 ; solveOneWithDepth (ctxtStkDepth dyn_flags,0,[]) inerts workItem
447 solveInteractWithDepth :: (Int, Int, [WorkItem])
448 -> InertSet -> WorkList -> TcS InertSet
449 solveInteractWithDepth ctxt@(max_depth,n,stack) inert ws
454 = solverDepthErrorTcS n stack
457 = do { traceTcS "solveInteractWithDepth" $
458 vcat [ text "Current depth =" <+> ppr n
459 , text "Max depth =" <+> ppr max_depth ]
461 -- Solve equalities first
462 ; let (eqs, non_eqs) = Bag.partitionBag isCTyEqCan ws
463 ; is_from_eqs <- Bag.foldlBagM (solveOneWithDepth ctxt) inert eqs
464 ; Bag.foldlBagM (solveOneWithDepth ctxt) is_from_eqs non_eqs }
467 -- Fully interact the given work item with an inert set, and return a
468 -- new inert set which has assimilated the new information.
469 solveOneWithDepth :: (Int, Int, [WorkItem])
470 -> InertSet -> WorkItem -> TcS InertSet
471 solveOneWithDepth (max_depth, n, stack) inert work
472 = do { traceTcS0 (indent ++ "Solving {") (ppr work)
473 ; (new_inert, new_work) <- runSolverPipeline thePipeline inert work
475 ; traceTcS0 (indent ++ "Subgoals:") (ppr new_work)
477 -- Recursively solve the new work generated
478 -- from workItem, with a greater depth
479 ; res_inert <- solveInteractWithDepth (max_depth, n+1, work:stack)
482 ; traceTcS0 (indent ++ "Done }") (ppr work)
485 indent = replicate (2*n) ' '
487 thePipeline :: [(String,SimplifierStage)]
488 thePipeline = [ ("interact with inert eqs", interactWithInertEqsStage)
489 , ("interact with inerts", interactWithInertsStage)
490 , ("spontaneous solve", spontaneousSolveStage)
491 , ("top-level reactions", topReactionsStage) ]
494 *********************************************************************************
496 The spontaneous-solve Stage
498 *********************************************************************************
500 Note [Efficient Orientation]
501 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
503 There are two cases where we have to be careful about
504 orienting equalities to get better efficiency.
506 Case 1: In Rewriting Equalities (function rewriteEqLHS)
508 When rewriting two equalities with the same LHS:
511 We have a choice of producing work (xi1 ~ xi2) (up-to the
512 canonicalization invariants) However, to prevent the inert items
513 from getting kicked out of the inerts first, we prefer to
514 canonicalize (xi1 ~ xi2) if (b) comes from the inert set, or (xi2
515 ~ xi1) if (a) comes from the inert set.
517 This choice is implemented using the WhichComesFromInert flag.
519 Case 2: Functional Dependencies
520 Again, we should prefer, if possible, the inert variables on the RHS
522 Case 3: IP improvement work
523 We must always rewrite so that the inert type is on the right.
526 spontaneousSolveStage :: SimplifierStage
527 spontaneousSolveStage workItem inerts
528 = do { mSolve <- trySpontaneousSolve workItem
531 SPCantSolve -> -- No spontaneous solution for him, keep going
532 return $ SR { sr_new_work = emptyWorkList
534 , sr_stop = ContinueWith workItem }
537 | not (isGivenCt workItem)
538 -- Original was wanted or derived but we have now made him
539 -- given so we have to interact him with the inerts due to
540 -- its status change. This in turn may produce more work.
541 -- We do this *right now* (rather than just putting workItem'
542 -- back into the work-list) because we've solved
543 -> do { (new_inert, new_work) <- runSolverPipeline
544 [ ("recursive interact with inert eqs", interactWithInertEqsStage)
545 , ("recursive interact with inerts", interactWithInertsStage)
547 ; return $ SR { sr_new_work = new_work
548 , sr_inerts = new_inert -- will include workItem'
552 -> -- Original was given; he must then be inert all right, and
553 -- workList' are all givens from flattening
554 return $ SR { sr_new_work = emptyWorkList
555 , sr_inerts = inerts `updInertSet` workItem'
557 SPError -> -- Return with no new work
558 return $ SR { sr_new_work = emptyWorkList
563 data SPSolveResult = SPCantSolve | SPSolved WorkItem | SPError
564 -- SPCantSolve means that we can't do the unification because e.g. the variable is untouchable
565 -- SPSolved workItem' gives us a new *given* to go on
566 -- SPError means that it's completely impossible to solve this equality, eg due to a kind error
569 -- @trySpontaneousSolve wi@ solves equalities where one side is a
570 -- touchable unification variable.
571 -- See Note [Touchables and givens]
572 trySpontaneousSolve :: WorkItem -> TcS SPSolveResult
573 trySpontaneousSolve workItem@(CTyEqCan { cc_id = cv, cc_flavor = gw, cc_tyvar = tv1, cc_rhs = xi })
576 | Just tv2 <- tcGetTyVar_maybe xi
577 = do { tch1 <- isTouchableMetaTyVar tv1
578 ; tch2 <- isTouchableMetaTyVar tv2
579 ; case (tch1, tch2) of
580 (True, True) -> trySpontaneousEqTwoWay cv gw tv1 tv2
581 (True, False) -> trySpontaneousEqOneWay cv gw tv1 xi
582 (False, True) -> trySpontaneousEqOneWay cv gw tv2 (mkTyVarTy tv1)
583 _ -> return SPCantSolve }
585 = do { tch1 <- isTouchableMetaTyVar tv1
586 ; if tch1 then trySpontaneousEqOneWay cv gw tv1 xi
587 else do { traceTcS "Untouchable LHS, can't spontaneously solve workitem:" (ppr workItem)
588 ; return SPCantSolve }
592 -- trySpontaneousSolve (CFunEqCan ...) = ...
593 -- See Note [No touchables as FunEq RHS] in TcSMonad
594 trySpontaneousSolve _ = return SPCantSolve
597 trySpontaneousEqOneWay :: CoVar -> CtFlavor -> TcTyVar -> Xi -> TcS SPSolveResult
598 -- tv is a MetaTyVar, not untouchable
599 trySpontaneousEqOneWay cv gw tv xi
600 | not (isSigTyVar tv) || isTyVarTy xi
601 = do { let kxi = typeKind xi -- NB: 'xi' is fully rewritten according to the inerts
602 -- so we have its more specific kind in our hands
603 ; if kxi `isSubKind` tyVarKind tv then
604 solveWithIdentity cv gw tv xi
605 else return SPCantSolve
607 else if tyVarKind tv `isSubKind` kxi then
608 return SPCantSolve -- kinds are compatible but we can't solveWithIdentity this way
609 -- This case covers the a_touchable :: * ~ b_untouchable :: ??
610 -- which has to be deferred or floated out for someone else to solve
611 -- it in a scope where 'b' is no longer untouchable.
612 else do { addErrorTcS KindError gw (mkTyVarTy tv) xi -- See Note [Kind errors]
616 | otherwise -- Still can't solve, sig tyvar and non-variable rhs
620 trySpontaneousEqTwoWay :: CoVar -> CtFlavor -> TcTyVar -> TcTyVar -> TcS SPSolveResult
621 -- Both tyvars are *touchable* MetaTyvars so there is only a chance for kind error here
622 trySpontaneousEqTwoWay cv gw tv1 tv2
624 , nicer_to_update_tv2 = solveWithIdentity cv gw tv2 (mkTyVarTy tv1)
626 = solveWithIdentity cv gw tv1 (mkTyVarTy tv2)
627 | otherwise -- None is a subkind of the other, but they are both touchable!
629 -- do { addErrorTcS KindError gw (mkTyVarTy tv1) (mkTyVarTy tv2)
630 -- ; return SPError }
634 nicer_to_update_tv2 = isSigTyVar tv1 || isSystemName (Var.varName tv2)
638 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
639 Consider the wanted problem:
640 alpha ~ (# Int, Int #)
641 where alpha :: ?? and (# Int, Int #) :: (#). We can't spontaneously solve this constraint,
642 but we should rather reject the program that give rise to it. If 'trySpontaneousEqTwoWay'
643 simply returns @CantSolve@ then that wanted constraint is going to propagate all the way and
644 get quantified over in inference mode. That's bad because we do know at this point that the
645 constraint is insoluble. Instead, we call 'recKindErrorTcS' here, which will fail later on.
647 The same applies in canonicalization code in case of kind errors in the givens.
649 However, when we canonicalize givens we only check for compatibility (@compatKind@).
650 If there were a kind error in the givens, this means some form of inconsistency or dead code.
652 You may think that when we spontaneously solve wanteds we may have to look through the
653 bindings to determine the right kind of the RHS type. E.g one may be worried that xi is
654 @alpha@ where alpha :: ? and a previous spontaneous solving has set (alpha := f) with (f :: *).
655 But we orient our constraints so that spontaneously solved ones can rewrite all other constraint
656 so this situation can't happen.
658 Note [Spontaneous solving and kind compatibility]
659 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
660 Note that our canonical constraints insist that *all* equalities (tv ~
661 xi) or (F xis ~ rhs) require the LHS and the RHS to have *compatible*
662 the same kinds. ("compatible" means one is a subKind of the other.)
664 - It can't be *equal* kinds, because
665 b) wanted constraints don't necessarily have identical kinds
667 b) a solved wanted constraint becomes a given
669 - SPJ thinks that *given* constraints (tv ~ tau) always have that
670 tau has a sub-kind of tv; and when solving wanted constraints
671 in trySpontaneousEqTwoWay we re-orient to achieve this.
673 - Note that the kind invariant is maintained by rewriting.
674 Eg wanted1 rewrites wanted2; if both were compatible kinds before,
675 wanted2 will be afterwards. Similarly givens.
678 - Givens from higher-rank, such as:
679 type family T b :: * -> * -> *
680 type instance T Bool = (->)
682 f :: forall a. ((T a ~ (->)) => ...) -> a -> ...
684 Whereas we would be able to apply the type instance, we would not be able to
685 use the given (T Bool ~ (->)) in the body of 'flop'
688 Note [Avoid double unifications]
689 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
690 The spontaneous solver has to return a given which mentions the unified unification
691 variable *on the left* of the equality. Here is what happens if not:
692 Original wanted: (a ~ alpha), (alpha ~ Int)
693 We spontaneously solve the first wanted, without changing the order!
694 given : a ~ alpha [having unified alpha := a]
695 Now the second wanted comes along, but he cannot rewrite the given, so we simply continue.
696 At the end we spontaneously solve that guy, *reunifying* [alpha := Int]
698 We avoid this problem by orienting the resulting given so that the unification
699 variable is on the left. [Note that alternatively we could attempt to
700 enforce this at canonicalization]
702 See also Note [No touchables as FunEq RHS] in TcSMonad; avoiding
703 double unifications is the main reason we disallow touchable
704 unification variables as RHS of type family equations: F xis ~ alpha.
709 solveWithIdentity :: CoVar -> CtFlavor -> TcTyVar -> Xi -> TcS SPSolveResult
710 -- Solve with the identity coercion
711 -- Precondition: kind(xi) is a sub-kind of kind(tv)
712 -- Precondition: CtFlavor is Wanted or Derived
713 -- See [New Wanted Superclass Work] to see why solveWithIdentity
714 -- must work for Derived as well as Wanted
715 -- Returns: workItem where
716 -- workItem = the new Given constraint
717 solveWithIdentity cv wd tv xi
718 = do { traceTcS "Sneaky unification:" $
719 vcat [text "Coercion variable: " <+> ppr wd,
720 text "Coercion: " <+> pprEq (mkTyVarTy tv) xi,
721 text "Left Kind is : " <+> ppr (typeKind (mkTyVarTy tv)),
722 text "Right Kind is : " <+> ppr (typeKind xi)
725 ; setWantedTyBind tv xi
726 ; cv_given <- newGivenCoVar (mkTyVarTy tv) xi xi
728 ; when (isWanted wd) (setWantedCoBind cv xi)
729 -- We don't want to do this for Derived, that's why we use 'when (isWanted wd)'
731 ; return $ SPSolved (CTyEqCan { cc_id = cv_given
732 , cc_flavor = mkGivenFlavor wd UnkSkol
733 , cc_tyvar = tv, cc_rhs = xi }) }
739 *********************************************************************************
741 The interact-with-inert Stage
743 *********************************************************************************
746 -- Interaction result of WorkItem <~> AtomicInert
748 = IR { ir_stop :: StopOrContinue
750 -- => Reagent (work item) consumed.
751 -- ContinueWith new_reagent
752 -- => Reagent transformed but keep gathering interactions.
753 -- The transformed item remains inert with respect
754 -- to any previously encountered inerts.
756 , ir_inert_action :: InertAction
757 -- Whether the inert item should remain in the InertSet.
759 , ir_new_work :: WorkList
760 -- new work items to add to the WorkList
763 -- What to do with the inert reactant.
764 data InertAction = KeepInert
766 | KeepTransformedInert CanonicalCt -- Keep a slightly transformed inert
768 mkIRContinue :: Monad m => WorkItem -> InertAction -> WorkList -> m InteractResult
769 mkIRContinue wi keep newWork = return $ IR (ContinueWith wi) keep newWork
771 mkIRStop :: Monad m => InertAction -> WorkList -> m InteractResult
772 mkIRStop keep newWork = return $ IR Stop keep newWork
774 dischargeWorkItem :: Monad m => m InteractResult
775 dischargeWorkItem = mkIRStop KeepInert emptyWorkList
777 noInteraction :: Monad m => WorkItem -> m InteractResult
778 noInteraction workItem = mkIRContinue workItem KeepInert emptyWorkList
780 data WhichComesFromInert = LeftComesFromInert | RightComesFromInert
781 -- See Note [Efficient Orientation]
784 ---------------------------------------------------
785 -- Interact a single WorkItem with the equalities of an inert set as
786 -- far as possible, i.e. until we get a Stop result from an individual
787 -- reaction (i.e. when the WorkItem is consumed), or until we've
788 -- interact the WorkItem with the entire equalities of the InertSet
790 interactWithInertEqsStage :: SimplifierStage
791 interactWithInertEqsStage workItem inert
792 = Bag.foldlBagM interactNext initITR (inert_eqs inert)
794 initITR = SR { sr_inerts = inert { inert_eqs = emptyCCan }
795 , sr_new_work = emptyWorkList
796 , sr_stop = ContinueWith workItem }
798 ---------------------------------------------------
799 -- Interact a single WorkItem with *non-equality* constraints in the inert set.
800 -- Precondition: equality interactions must have already happened, hence we have
801 -- to pick up some information from the incoming inert, before folding over the
802 -- "Other" constraints it contains!
804 interactWithInertsStage :: SimplifierStage
805 interactWithInertsStage workItem inert
806 = let (relevant, inert_residual) = getISRelevant workItem inert
807 initITR = SR { sr_inerts = inert_residual
808 , sr_new_work = emptyWorkList
809 , sr_stop = ContinueWith workItem }
810 in Bag.foldlBagM interactNext initITR relevant
812 getISRelevant :: CanonicalCt -> InertSet -> (CanonicalCts, InertSet)
813 getISRelevant (CFrozenErr {}) is = (emptyCCan, is)
814 -- Nothing s relevant; we have alread interacted
815 -- it with the equalities in the inert set
817 getISRelevant (CDictCan { cc_class = cls } ) is
818 = let (relevant, residual_map) = getRelevantCts cls (inert_dicts is)
819 in (relevant, is { inert_dicts = residual_map })
820 getISRelevant (CFunEqCan { cc_fun = tc } ) is
821 = let (relevant, residual_map) = getRelevantCts tc (inert_funeqs is)
822 in (relevant, is { inert_funeqs = residual_map })
823 getISRelevant (CIPCan { cc_ip_nm = nm }) is
824 = let (relevant, residual_map) = getRelevantCts nm (inert_ips is)
825 in (relevant, is { inert_ips = residual_map })
826 -- An equality, finally, may kick everything except equalities out
827 -- because we have already interacted the equalities in interactWithInertEqsStage
828 getISRelevant _eq_ct is -- Equality, everything is relevant for this one
829 -- TODO: if we were caching variables, we'd know that only
830 -- some are relevant. Experiment with this for now.
831 = let cts = cCanMapToBag (inert_ips is) `unionBags`
832 cCanMapToBag (inert_dicts is) `unionBags` cCanMapToBag (inert_funeqs is)
833 in (cts, is { inert_dicts = emptyCCanMap
834 , inert_ips = emptyCCanMap
835 , inert_funeqs = emptyCCanMap })
837 interactNext :: StageResult -> AtomicInert -> TcS StageResult
838 interactNext it inert
839 | ContinueWith workItem <- sr_stop it
840 = do { let inerts = sr_inerts it
842 ; ir <- interactWithInert inert workItem
844 -- New inerts depend on whether we KeepInert or not and must
845 -- be updated with FD improvement information from the interaction result (ir)
846 ; let inerts_new = case ir_inert_action ir of
847 KeepInert -> inerts `updInertSet` inert
849 KeepTransformedInert inert' -> inerts `updInertSet` inert'
851 ; return $ SR { sr_inerts = inerts_new
852 , sr_new_work = sr_new_work it `unionWorkLists` ir_new_work ir
853 , sr_stop = ir_stop ir } }
855 = return $ it { sr_inerts = (sr_inerts it) `updInertSet` inert }
857 -- Do a single interaction of two constraints.
858 interactWithInert :: AtomicInert -> WorkItem -> TcS InteractResult
859 interactWithInert inert workitem
860 = do { ctxt <- getTcSContext
861 ; let is_allowed = allowedInteraction (simplEqsOnly ctxt) inert workitem
864 doInteractWithInert inert workitem
866 noInteraction workitem
869 allowedInteraction :: Bool -> AtomicInert -> WorkItem -> Bool
870 -- Allowed interactions
871 allowedInteraction eqs_only (CDictCan {}) (CDictCan {}) = not eqs_only
872 allowedInteraction eqs_only (CIPCan {}) (CIPCan {}) = not eqs_only
873 allowedInteraction _ _ _ = True
875 --------------------------------------------
876 doInteractWithInert :: CanonicalCt -> CanonicalCt -> TcS InteractResult
877 -- Identical class constraints.
880 (CDictCan { cc_id = d1, cc_flavor = fl1, cc_class = cls1, cc_tyargs = tys1 })
881 workItem@(CDictCan { cc_flavor = fl2, cc_class = cls2, cc_tyargs = tys2 })
882 | cls1 == cls2 && (and $ zipWith tcEqType tys1 tys2)
883 = solveOneFromTheOther (d1,fl1) workItem
885 | cls1 == cls2 && (not (isGiven fl1 && isGiven fl2))
886 = -- See Note [When improvement happens]
887 do { let pty1 = ClassP cls1 tys1
888 pty2 = ClassP cls2 tys2
889 work_item_pred_loc = (pty2, pprFlavorArising fl2)
890 inert_pred_loc = (pty1, pprFlavorArising fl1)
891 loc = combineCtLoc fl1 fl2
892 eqn_pred_locs = improveFromAnother work_item_pred_loc inert_pred_loc
893 -- See Note [Efficient Orientation]
895 ; derived_evs <- mkDerivedFunDepEqns loc eqn_pred_locs
896 ; fd_work <- mapM mkCanonicalFEV derived_evs
897 -- See Note [Generating extra equalities]
899 ; mkIRContinue workItem KeepInert (unionManyBags fd_work)
902 -- Class constraint and given equality: use the equality to rewrite
903 -- the class constraint.
904 doInteractWithInert (CTyEqCan { cc_id = cv, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi })
905 (CDictCan { cc_id = dv, cc_flavor = wfl, cc_class = cl, cc_tyargs = xis })
906 | ifl `canRewrite` wfl
907 , tv `elemVarSet` tyVarsOfTypes xis
908 = do { rewritten_dict <- rewriteDict (cv,tv,xi) (dv,wfl,cl,xis)
909 -- Continue with rewritten Dictionary because we can only be in the
910 -- interactWithEqsStage, so the dictionary is inert.
911 ; mkIRContinue rewritten_dict KeepInert emptyWorkList }
913 doInteractWithInert (CDictCan { cc_id = dv, cc_flavor = ifl, cc_class = cl, cc_tyargs = xis })
914 workItem@(CTyEqCan { cc_id = cv, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi })
915 | wfl `canRewrite` ifl
916 , tv `elemVarSet` tyVarsOfTypes xis
917 = do { rewritten_dict <- rewriteDict (cv,tv,xi) (dv,ifl,cl,xis)
918 ; mkIRContinue workItem DropInert (workListFromCCan rewritten_dict) }
920 -- Class constraint and given equality: use the equality to rewrite
921 -- the class constraint.
922 doInteractWithInert (CTyEqCan { cc_id = cv, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi })
923 (CIPCan { cc_id = ipid, cc_flavor = wfl, cc_ip_nm = nm, cc_ip_ty = ty })
924 | ifl `canRewrite` wfl
925 , tv `elemVarSet` tyVarsOfType ty
926 = do { rewritten_ip <- rewriteIP (cv,tv,xi) (ipid,wfl,nm,ty)
927 ; mkIRContinue rewritten_ip KeepInert emptyWorkList }
929 doInteractWithInert (CIPCan { cc_id = ipid, cc_flavor = ifl, cc_ip_nm = nm, cc_ip_ty = ty })
930 workItem@(CTyEqCan { cc_id = cv, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi })
931 | wfl `canRewrite` ifl
932 , tv `elemVarSet` tyVarsOfType ty
933 = do { rewritten_ip <- rewriteIP (cv,tv,xi) (ipid,ifl,nm,ty)
934 ; mkIRContinue workItem DropInert (workListFromCCan rewritten_ip) }
936 -- Two implicit parameter constraints. If the names are the same,
937 -- but their types are not, we generate a wanted type equality
938 -- that equates the type (this is "improvement").
939 -- However, we don't actually need the coercion evidence,
940 -- so we just generate a fresh coercion variable that isn't used anywhere.
941 doInteractWithInert (CIPCan { cc_id = id1, cc_flavor = ifl, cc_ip_nm = nm1, cc_ip_ty = ty1 })
942 workItem@(CIPCan { cc_flavor = wfl, cc_ip_nm = nm2, cc_ip_ty = ty2 })
943 | nm1 == nm2 && isGiven wfl && isGiven ifl
944 = -- See Note [Overriding implicit parameters]
945 -- Dump the inert item, override totally with the new one
946 -- Do not require type equality
947 mkIRContinue workItem DropInert emptyWorkList
949 | nm1 == nm2 && ty1 `tcEqType` ty2
950 = solveOneFromTheOther (id1,ifl) workItem
953 = -- See Note [When improvement happens]
954 do { co_var <- newWantedCoVar ty2 ty1 -- See Note [Efficient Orientation]
955 ; let flav = Wanted (combineCtLoc ifl wfl)
956 ; cans <- mkCanonical flav co_var
957 ; mkIRContinue workItem KeepInert cans }
961 -- Never rewrite a given with a wanted equality, and a type function
962 -- equality can never rewrite an equality. We rewrite LHS *and* RHS
963 -- of function equalities so that our inert set exposes everything that
964 -- we know about equalities.
966 -- Inert: equality, work item: function equality
967 doInteractWithInert (CTyEqCan { cc_id = cv1, cc_flavor = ifl, cc_tyvar = tv, cc_rhs = xi1 })
968 (CFunEqCan { cc_id = cv2, cc_flavor = wfl, cc_fun = tc
969 , cc_tyargs = args, cc_rhs = xi2 })
970 | ifl `canRewrite` wfl
971 , tv `elemVarSet` tyVarsOfTypes (xi2:args) -- Rewrite RHS as well
972 = do { rewritten_funeq <- rewriteFunEq (cv1,tv,xi1) (cv2,wfl,tc,args,xi2)
973 ; mkIRStop KeepInert (workListFromCCan rewritten_funeq) }
974 -- Must Stop here, because we may no longer be inert after the rewritting.
976 -- Inert: function equality, work item: equality
977 doInteractWithInert (CFunEqCan {cc_id = cv1, cc_flavor = ifl, cc_fun = tc
978 , cc_tyargs = args, cc_rhs = xi1 })
979 workItem@(CTyEqCan { cc_id = cv2, cc_flavor = wfl, cc_tyvar = tv, cc_rhs = xi2 })
980 | wfl `canRewrite` ifl
981 , tv `elemVarSet` tyVarsOfTypes (xi1:args) -- Rewrite RHS as well
982 = do { rewritten_funeq <- rewriteFunEq (cv2,tv,xi2) (cv1,ifl,tc,args,xi1)
983 ; mkIRContinue workItem DropInert (workListFromCCan rewritten_funeq) }
984 -- One may think that we could (KeepTransformedInert rewritten_funeq)
985 -- but that is wrong, because it may end up not being inert with respect
986 -- to future inerts. Example:
987 -- Original inert = { F xis ~ [a], b ~ Maybe Int }
988 -- Work item comes along = a ~ [b]
989 -- If we keep { F xis ~ [b] } in the inert set we will end up with:
990 -- { F xis ~ [b], b ~ Maybe Int, a ~ [Maybe Int] }
991 -- At the end, which is *not* inert. So we should unfortunately DropInert here.
993 doInteractWithInert (CFunEqCan { cc_id = cv1, cc_flavor = fl1, cc_fun = tc1
994 , cc_tyargs = args1, cc_rhs = xi1 })
995 workItem@(CFunEqCan { cc_id = cv2, cc_flavor = fl2, cc_fun = tc2
996 , cc_tyargs = args2, cc_rhs = xi2 })
997 | fl1 `canSolve` fl2 && lhss_match
998 = do { cans <- rewriteEqLHS LeftComesFromInert (mkCoVarCoercion cv1,xi1) (cv2,fl2,xi2)
999 ; mkIRStop KeepInert cans }
1000 | fl2 `canSolve` fl1 && lhss_match
1001 = do { cans <- rewriteEqLHS RightComesFromInert (mkCoVarCoercion cv2,xi2) (cv1,fl1,xi1)
1002 ; mkIRContinue workItem DropInert cans }
1004 lhss_match = tc1 == tc2 && and (zipWith tcEqType args1 args2)
1006 doInteractWithInert (CTyEqCan { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 })
1007 workItem@(CTyEqCan { cc_id = cv2, cc_flavor = fl2, cc_tyvar = tv2, cc_rhs = xi2 })
1008 -- Check for matching LHS
1009 | fl1 `canSolve` fl2 && tv1 == tv2
1010 = do { cans <- rewriteEqLHS LeftComesFromInert (mkCoVarCoercion cv1,xi1) (cv2,fl2,xi2)
1011 ; mkIRStop KeepInert cans }
1013 | fl2 `canSolve` fl1 && tv1 == tv2
1014 = do { cans <- rewriteEqLHS RightComesFromInert (mkCoVarCoercion cv2,xi2) (cv1,fl1,xi1)
1015 ; mkIRContinue workItem DropInert cans }
1016 -- Check for rewriting RHS
1017 | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfType xi2
1018 = do { rewritten_eq <- rewriteEqRHS (cv1,tv1,xi1) (cv2,fl2,tv2,xi2)
1019 ; mkIRStop KeepInert rewritten_eq }
1020 | fl2 `canRewrite` fl1 && tv2 `elemVarSet` tyVarsOfType xi1
1021 = do { rewritten_eq <- rewriteEqRHS (cv2,tv2,xi2) (cv1,fl1,tv1,xi1)
1022 ; mkIRContinue workItem DropInert rewritten_eq }
1024 doInteractWithInert (CTyEqCan { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 })
1025 (CFrozenErr { cc_id = cv2, cc_flavor = fl2 })
1026 | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfEvVar cv2
1027 = do { rewritten_frozen <- rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1028 ; mkIRStop KeepInert rewritten_frozen }
1030 doInteractWithInert (CFrozenErr { cc_id = cv2, cc_flavor = fl2 })
1031 workItem@(CTyEqCan { cc_id = cv1, cc_flavor = fl1, cc_tyvar = tv1, cc_rhs = xi1 })
1032 | fl1 `canRewrite` fl2 && tv1 `elemVarSet` tyVarsOfEvVar cv2
1033 = do { rewritten_frozen <- rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1034 ; mkIRContinue workItem DropInert rewritten_frozen }
1036 -- Fall-through case for all other situations
1037 doInteractWithInert _ workItem = noInteraction workItem
1039 -------------------------
1040 -- Equational Rewriting
1041 rewriteDict :: (CoVar, TcTyVar, Xi) -> (DictId, CtFlavor, Class, [Xi]) -> TcS CanonicalCt
1042 rewriteDict (cv,tv,xi) (dv,gw,cl,xis)
1043 = do { let cos = substTysWith [tv] [mkCoVarCoercion cv] xis -- xis[tv] ~ xis[xi]
1044 args = substTysWith [tv] [xi] xis
1046 dict_co = mkTyConCoercion con cos
1047 ; dv' <- newDictVar cl args
1049 Wanted {} -> setDictBind dv (EvCast dv' (mkSymCoercion dict_co))
1050 Given {} -> setDictBind dv' (EvCast dv dict_co)
1051 Derived {} -> return () -- Derived dicts we don't set any evidence
1053 ; return (CDictCan { cc_id = dv'
1056 , cc_tyargs = args }) }
1058 rewriteIP :: (CoVar,TcTyVar,Xi) -> (EvVar,CtFlavor, IPName Name, TcType) -> TcS CanonicalCt
1059 rewriteIP (cv,tv,xi) (ipid,gw,nm,ty)
1060 = do { let ip_co = substTyWith [tv] [mkCoVarCoercion cv] ty -- ty[tv] ~ t[xi]
1061 ty' = substTyWith [tv] [xi] ty
1062 ; ipid' <- newIPVar nm ty'
1064 Wanted {} -> setIPBind ipid (EvCast ipid' (mkSymCoercion ip_co))
1065 Given {} -> setIPBind ipid' (EvCast ipid ip_co)
1066 Derived {} -> return () -- Derived ips: we don't set any evidence
1068 ; return (CIPCan { cc_id = ipid'
1071 , cc_ip_ty = ty' }) }
1073 rewriteFunEq :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor,TyCon, [Xi], Xi) -> TcS CanonicalCt
1074 rewriteFunEq (cv1,tv,xi1) (cv2,gw, tc,args,xi2) -- cv2 :: F args ~ xi2
1075 = do { let arg_cos = substTysWith [tv] [mkCoVarCoercion cv1] args
1076 args' = substTysWith [tv] [xi1] args
1077 fun_co = mkTyConCoercion tc arg_cos -- fun_co :: F args ~ F args'
1079 xi2' = substTyWith [tv] [xi1] xi2
1080 xi2_co = substTyWith [tv] [mkCoVarCoercion cv1] xi2 -- xi2_co :: xi2 ~ xi2'
1081 ; cv2' <- case gw of
1082 Wanted {} -> do { cv2' <- newWantedCoVar (mkTyConApp tc args') xi2'
1083 ; setWantedCoBind cv2 $
1084 fun_co `mkTransCoercion`
1085 mkCoVarCoercion cv2' `mkTransCoercion` mkSymCoercion xi2_co
1087 Given {} -> newGivenCoVar (mkTyConApp tc args') xi2' $
1088 mkSymCoercion fun_co `mkTransCoercion`
1089 mkCoVarCoercion cv2 `mkTransCoercion` xi2_co
1090 Derived {} -> newDerivedId (EqPred (mkTyConApp tc args') xi2')
1092 ; return (CFunEqCan { cc_id = cv2'
1096 , cc_rhs = xi2' }) }
1099 rewriteEqRHS :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor,TcTyVar,Xi) -> TcS WorkList
1100 -- Use the first equality to rewrite the second, flavors already checked.
1101 -- E.g. c1 : tv1 ~ xi1 c2 : tv2 ~ xi2
1102 -- rewrites c2 to give
1103 -- c2' : tv2 ~ xi2[xi1/tv1]
1104 -- We must do an occurs check to sure the new constraint is canonical
1105 -- So we might return an empty bag
1106 rewriteEqRHS (cv1,tv1,xi1) (cv2,gw,tv2,xi2)
1107 | Just tv2' <- tcGetTyVar_maybe xi2'
1108 , tv2 == tv2' -- In this case xi2[xi1/tv1] = tv2, so we have tv2~tv2
1109 = do { when (isWanted gw) (setWantedCoBind cv2 (mkSymCoercion co2'))
1110 ; return emptyCCan }
1115 -> do { cv2' <- newWantedCoVar (mkTyVarTy tv2) xi2'
1116 ; setWantedCoBind cv2 $
1117 mkCoVarCoercion cv2' `mkTransCoercion` mkSymCoercion co2'
1120 -> newGivenCoVar (mkTyVarTy tv2) xi2' $
1121 mkCoVarCoercion cv2 `mkTransCoercion` co2'
1123 -> newDerivedId (EqPred (mkTyVarTy tv2) xi2')
1125 ; canEq gw cv2' (mkTyVarTy tv2) xi2'
1128 xi2' = substTyWith [tv1] [xi1] xi2
1129 co2' = substTyWith [tv1] [mkCoVarCoercion cv1] xi2 -- xi2 ~ xi2[xi1/tv1]
1132 rewriteEqLHS :: WhichComesFromInert -> (Coercion,Xi) -> (CoVar,CtFlavor,Xi) -> TcS WorkList
1133 -- Used to ineract two equalities of the following form:
1134 -- First Equality: co1: (XXX ~ xi1)
1135 -- Second Equality: cv2: (XXX ~ xi2)
1136 -- Where the cv1 `canSolve` cv2 equality
1137 -- We have an option of creating new work (xi1 ~ xi2) OR (xi2 ~ xi1),
1138 -- See Note [Efficient Orientation] for that
1139 rewriteEqLHS which (co1,xi1) (cv2,gw,xi2)
1140 = do { cv2' <- case (isWanted gw, which) of
1141 (True,LeftComesFromInert) ->
1142 do { cv2' <- newWantedCoVar xi2 xi1
1143 ; setWantedCoBind cv2 $
1144 co1 `mkTransCoercion` mkSymCoercion (mkCoVarCoercion cv2')
1146 (True,RightComesFromInert) ->
1147 do { cv2' <- newWantedCoVar xi1 xi2
1148 ; setWantedCoBind cv2 $
1149 co1 `mkTransCoercion` mkCoVarCoercion cv2'
1151 (False,LeftComesFromInert) ->
1153 newGivenCoVar xi2 xi1 $
1154 mkSymCoercion (mkCoVarCoercion cv2) `mkTransCoercion` co1
1155 else newDerivedId (EqPred xi2 xi1)
1156 (False,RightComesFromInert) ->
1158 newGivenCoVar xi1 xi2 $
1159 mkSymCoercion co1 `mkTransCoercion` mkCoVarCoercion cv2
1160 else newDerivedId (EqPred xi1 xi2)
1161 ; mkCanonical gw cv2' }
1163 rewriteFrozen :: (CoVar,TcTyVar,Xi) -> (CoVar,CtFlavor) -> TcS WorkList
1164 rewriteFrozen (cv1, tv1, xi1) (cv2, fl2)
1167 Wanted {} -> do { cv2' <- newWantedCoVar ty2a' ty2b'
1168 -- ty2a[xi1/tv1] ~ ty2b[xi1/tv1]
1169 ; setWantedCoBind cv2 $
1170 co2a' `mkTransCoercion`
1171 mkCoVarCoercion cv2' `mkTransCoercion`
1175 Given {} -> newGivenCoVar ty2a' ty2b' $
1176 mkSymCoercion co2a' `mkTransCoercion`
1177 mkCoVarCoercion cv2 `mkTransCoercion`
1180 Derived {} -> newDerivedId (EqPred ty2a' ty2b')
1181 ; return (singleCCan $ CFrozenErr { cc_id = cv2', cc_flavor = fl2 }) }
1183 (ty2a, ty2b) = coVarKind cv2 -- cv2 : ty2a ~ ty2b
1184 ty2a' = substTyWith [tv1] [xi1] ty2a
1185 ty2b' = substTyWith [tv1] [xi1] ty2b
1187 co2a' = substTyWith [tv1] [mkCoVarCoercion cv1] ty2a -- ty2a ~ ty2a[xi1/tv1]
1188 co2b' = substTyWith [tv1] [mkCoVarCoercion cv1] ty2b -- ty2b ~ ty2b[xi1/tv1]
1190 solveOneFromTheOther :: (EvVar, CtFlavor) -> CanonicalCt -> TcS InteractResult
1191 -- First argument inert, second argument workitem. They both represent
1192 -- wanted/given/derived evidence for the *same* predicate so we try here to
1193 -- discharge one directly from the other.
1195 -- Precondition: value evidence only (implicit parameters, classes)
1197 solveOneFromTheOther (iid,ifl) workItem
1198 | ifl `canSolve` wfl
1199 = do { when (isWanted wfl) $ setEvBind wid (EvId iid)
1200 -- Overwrite the binding, if one exists
1201 -- For Givens, which are lambda-bound, nothing to overwrite,
1202 ; dischargeWorkItem }
1203 | wfl `canSolve` ifl
1204 = do { when (isWanted ifl) $ setEvBind iid (EvId wid)
1205 ; mkIRContinue workItem DropInert emptyWorkList }
1207 | otherwise -- One of the two is Derived, we can just throw it away,
1208 -- preferrably the work item.
1209 = if isDerived wfl then dischargeWorkItem
1210 else mkIRContinue workItem DropInert emptyWorkList
1213 wfl = cc_flavor workItem
1214 wid = cc_id workItem
1217 Note [Superclasses and recursive dictionaries]
1218 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1219 Overlaps with Note [SUPERCLASS-LOOP 1]
1220 Note [SUPERCLASS-LOOP 2]
1221 Note [Recursive instances and superclases]
1222 ToDo: check overlap and delete redundant stuff
1224 Right before adding a given into the inert set, we must
1225 produce some more work, that will bring the superclasses
1226 of the given into scope. The superclass constraints go into
1229 When we simplify a wanted constraint, if we first see a matching
1230 instance, we may produce new wanted work. To (1) avoid doing this work
1231 twice in the future and (2) to handle recursive dictionaries we may ``cache''
1232 this item as given into our inert set WITHOUT adding its superclass constraints,
1233 otherwise we'd be in danger of creating a loop [In fact this was the exact reason
1234 for doing the isGoodRecEv check in an older version of the type checker].
1236 But now we have added partially solved constraints to the worklist which may
1237 interact with other wanteds. Consider the example:
1241 class Eq b => Foo a b --- 0-th selector
1242 instance Eq a => Foo [a] a --- fooDFun
1244 and wanted (Foo [t] t). We are first going to see that the instance matches
1245 and create an inert set that includes the solved (Foo [t] t) but not its superclasses:
1246 d1 :_g Foo [t] t d1 := EvDFunApp fooDFun d3
1247 Our work list is going to contain a new *wanted* goal
1250 Ok, so how do we get recursive dictionaries, at all:
1254 data D r = ZeroD | SuccD (r (D r));
1256 instance (Eq (r (D r))) => Eq (D r) where
1257 ZeroD == ZeroD = True
1258 (SuccD a) == (SuccD b) = a == b
1261 equalDC :: D [] -> D [] -> Bool;
1264 We need to prove (Eq (D [])). Here's how we go:
1268 by instance decl, holds if
1272 *BUT* we have an inert set which gives us (no superclasses):
1274 By the instance declaration of Eq we can show the 'd2' goal if
1276 where d2 = dfEqList d3
1278 Now, however this wanted can interact with our inert d1 to set:
1280 and solve the goal. Why was this interaction OK? Because, if we chase the
1281 evidence of d1 ~~> dfEqD d2 ~~-> dfEqList d3, so by setting d3 := d1 we
1283 d3 := dfEqD2 (dfEqList d3)
1284 which is FINE because the use of d3 is protected by the instance function
1287 So, our strategy is to try to put solved wanted dictionaries into the
1288 inert set along with their superclasses (when this is meaningful,
1289 i.e. when new wanted goals are generated) but solve a wanted dictionary
1290 from a given only in the case where the evidence variable of the
1291 wanted is mentioned in the evidence of the given (recursively through
1292 the evidence binds) in a protected way: more instance function applications
1293 than superclass selectors.
1295 Here are some more examples from GHC's previous type checker
1299 This code arises in the context of "Scrap Your Boilerplate with Class"
1303 instance Sat (ctx Char) => Data ctx Char -- dfunData1
1304 instance (Sat (ctx [a]), Data ctx a) => Data ctx [a] -- dfunData2
1306 class Data Maybe a => Foo a
1308 instance Foo t => Sat (Maybe t) -- dfunSat
1310 instance Data Maybe a => Foo a -- dfunFoo1
1311 instance Foo a => Foo [a] -- dfunFoo2
1312 instance Foo [Char] -- dfunFoo3
1314 Consider generating the superclasses of the instance declaration
1315 instance Foo a => Foo [a]
1317 So our problem is this
1319 d1 :_w Data Maybe [t]
1321 We may add the given in the inert set, along with its superclasses
1322 [assuming we don't fail because there is a matching instance, see
1323 tryTopReact, given case ]
1327 d01 :_g Data Maybe t -- d2 := EvDictSuperClass d0 0
1328 d1 :_w Data Maybe [t]
1329 Then d2 can readily enter the inert, and we also do solving of the wanted
1332 d1 :_s Data Maybe [t] d1 := dfunData2 d2 d3
1334 d2 :_w Sat (Maybe [t])
1336 d01 :_g Data Maybe t
1337 Now, we may simplify d2 more:
1340 d1 :_s Data Maybe [t] d1 := dfunData2 d2 d3
1341 d1 :_g Data Maybe [t]
1342 d2 :_g Sat (Maybe [t]) d2 := dfunSat d4
1346 d01 :_g Data Maybe t
1348 Now, we can just solve d3.
1351 d1 :_s Data Maybe [t] d1 := dfunData2 d2 d3
1352 d2 :_g Sat (Maybe [t]) d2 := dfunSat d4
1355 d01 :_g Data Maybe t
1356 And now we can simplify d4 again, but since it has superclasses we *add* them to the worklist:
1359 d1 :_s Data Maybe [t] d1 := dfunData2 d2 d3
1360 d2 :_g Sat (Maybe [t]) d2 := dfunSat d4
1361 d4 :_g Foo [t] d4 := dfunFoo2 d5
1364 d6 :_g Data Maybe [t] d6 := EvDictSuperClass d4 0
1365 d01 :_g Data Maybe t
1366 Now, d5 can be solved! (and its superclass enter scope)
1369 d1 :_s Data Maybe [t] d1 := dfunData2 d2 d3
1370 d2 :_g Sat (Maybe [t]) d2 := dfunSat d4
1371 d4 :_g Foo [t] d4 := dfunFoo2 d5
1372 d5 :_g Foo t d5 := dfunFoo1 d7
1375 d6 :_g Data Maybe [t]
1376 d8 :_g Data Maybe t d8 := EvDictSuperClass d5 0
1377 d01 :_g Data Maybe t
1380 [1] Suppose we pick d8 and we react him with d01. Which of the two givens should
1381 we keep? Well, we *MUST NOT* drop d01 because d8 contains recursive evidence
1382 that must not be used (look at case interactInert where both inert and workitem
1383 are givens). So we have several options:
1384 - Drop the workitem always (this will drop d8)
1385 This feels very unsafe -- what if the work item was the "good" one
1386 that should be used later to solve another wanted?
1387 - Don't drop anyone: the inert set may contain multiple givens!
1388 [This is currently implemented]
1390 The "don't drop anyone" seems the most safe thing to do, so now we come to problem 2:
1391 [2] We have added both d6 and d01 in the inert set, and we are interacting our wanted
1392 d7. Now the [isRecDictEv] function in the ineration solver
1393 [case inert-given workitem-wanted] will prevent us from interacting d7 := d8
1394 precisely because chasing the evidence of d8 leads us to an unguarded use of d7.
1396 So, no interaction happens there. Then we meet d01 and there is no recursion
1397 problem there [isRectDictEv] gives us the OK to interact and we do solve d7 := d01!
1399 Note [SUPERCLASS-LOOP 1]
1400 ~~~~~~~~~~~~~~~~~~~~~~~~
1401 We have to be very, very careful when generating superclasses, lest we
1402 accidentally build a loop. Here's an example:
1406 class S a => C a where { opc :: a -> a }
1407 class S b => D b where { opd :: b -> b }
1409 instance C Int where
1412 instance D Int where
1415 From (instance C Int) we get the constraint set {ds1:S Int, dd:D Int}
1416 Simplifying, we may well get:
1417 $dfCInt = :C ds1 (opd dd)
1420 Notice that we spot that we can extract ds1 from dd.
1422 Alas! Alack! We can do the same for (instance D Int):
1424 $dfDInt = :D ds2 (opc dc)
1428 And now we've defined the superclass in terms of itself.
1429 Two more nasty cases are in
1434 - Satisfy the superclass context *all by itself*
1435 (tcSimplifySuperClasses)
1436 - And do so completely; i.e. no left-over constraints
1437 to mix with the constraints arising from method declarations
1440 Note [SUPERCLASS-LOOP 2]
1441 ~~~~~~~~~~~~~~~~~~~~~~~~
1442 We need to be careful when adding "the constaint we are trying to prove".
1443 Suppose we are *given* d1:Ord a, and want to deduce (d2:C [a]) where
1445 class Ord a => C a where
1446 instance Ord [a] => C [a] where ...
1448 Then we'll use the instance decl to deduce C [a] from Ord [a], and then add the
1449 superclasses of C [a] to avails. But we must not overwrite the binding
1450 for Ord [a] (which is obtained from Ord a) with a superclass selection or we'll just
1453 Here's another variant, immortalised in tcrun020
1454 class Monad m => C1 m
1455 class C1 m => C2 m x
1456 instance C2 Maybe Bool
1457 For the instance decl we need to build (C1 Maybe), and it's no good if
1458 we run around and add (C2 Maybe Bool) and its superclasses to the avails
1459 before we search for C1 Maybe.
1461 Here's another example
1462 class Eq b => Foo a b
1463 instance Eq a => Foo [a] a
1467 we'll first deduce that it holds (via the instance decl). We must not
1468 then overwrite the Eq t constraint with a superclass selection!
1470 At first I had a gross hack, whereby I simply did not add superclass constraints
1471 in addWanted, though I did for addGiven and addIrred. This was sub-optimal,
1472 becuase it lost legitimate superclass sharing, and it still didn't do the job:
1473 I found a very obscure program (now tcrun021) in which improvement meant the
1474 simplifier got two bites a the cherry... so something seemed to be an Stop
1475 first time, but reducible next time.
1477 Now we implement the Right Solution, which is to check for loops directly
1478 when adding superclasses. It's a bit like the occurs check in unification.
1480 Note [Recursive instances and superclases]
1481 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1482 Consider this code, which arises in the context of "Scrap Your
1483 Boilerplate with Class".
1487 instance Sat (ctx Char) => Data ctx Char
1488 instance (Sat (ctx [a]), Data ctx a) => Data ctx [a]
1490 class Data Maybe a => Foo a
1492 instance Foo t => Sat (Maybe t)
1494 instance Data Maybe a => Foo a
1495 instance Foo a => Foo [a]
1498 In the instance for Foo [a], when generating evidence for the superclasses
1499 (ie in tcSimplifySuperClasses) we need a superclass (Data Maybe [a]).
1500 Using the instance for Data, we therefore need
1501 (Sat (Maybe [a], Data Maybe a)
1502 But we are given (Foo a), and hence its superclass (Data Maybe a).
1503 So that leaves (Sat (Maybe [a])). Using the instance for Sat means
1504 we need (Foo [a]). And that is the very dictionary we are bulding
1505 an instance for! So we must put that in the "givens". So in this
1507 Given: Foo a, Foo [a]
1508 Wanted: Data Maybe [a]
1510 BUT we must *not not not* put the *superclasses* of (Foo [a]) in
1511 the givens, which is what 'addGiven' would normally do. Why? Because
1512 (Data Maybe [a]) is the superclass, so we'd "satisfy" the wanted
1513 by selecting a superclass from Foo [a], which simply makes a loop.
1515 On the other hand we *must* put the superclasses of (Foo a) in
1516 the givens, as you can see from the derivation described above.
1518 Conclusion: in the very special case of tcSimplifySuperClasses
1519 we have one 'given' (namely the "this" dictionary) whose superclasses
1520 must not be added to 'givens' by addGiven.
1522 There is a complication though. Suppose there are equalities
1523 instance (Eq a, a~b) => Num (a,b)
1524 Then we normalise the 'givens' wrt the equalities, so the original
1525 given "this" dictionary is cast to one of a different type. So it's a
1526 bit trickier than before to identify the "special" dictionary whose
1527 superclasses must not be added. See test
1528 indexed-types/should_run/EqInInstance
1530 We need a persistent property of the dictionary to record this
1531 special-ness. Current I'm using the InstLocOrigin (a bit of a hack,
1532 but cool), which is maintained by dictionary normalisation.
1533 Specifically, the InstLocOrigin is
1535 then the no-superclass thing kicks in. WATCH OUT if you fiddle
1538 Note [MATCHING-SYNONYMS]
1539 ~~~~~~~~~~~~~~~~~~~~~~~~
1540 When trying to match a dictionary (D tau) to a top-level instance, or a
1541 type family equation (F taus_1 ~ tau_2) to a top-level family instance,
1542 we do *not* need to expand type synonyms because the matcher will do that for us.
1545 Note [RHS-FAMILY-SYNONYMS]
1546 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1547 The RHS of a family instance is represented as yet another constructor which is
1548 like a type synonym for the real RHS the programmer declared. Eg:
1549 type instance F (a,a) = [a]
1551 :R32 a = [a] -- internal type synonym introduced
1552 F (a,a) ~ :R32 a -- instance
1554 When we react a family instance with a type family equation in the work list
1555 we keep the synonym-using RHS without expansion.
1558 *********************************************************************************
1560 The top-reaction Stage
1562 *********************************************************************************
1565 -- If a work item has any form of interaction with top-level we get this
1566 data TopInteractResult
1567 = NoTopInt -- No top-level interaction
1568 -- Equivalent to (SomeTopInt emptyWorkList (ContinueWith work_item))
1570 { tir_new_work :: WorkList -- Sub-goals or new work (could be given,
1571 -- for superclasses)
1572 , tir_new_inert :: StopOrContinue -- The input work item, ready to become *inert* now:
1573 } -- NB: in ``given'' (solved) form if the
1574 -- original was wanted or given and instance match
1575 -- was found, but may also be in wanted form if we
1576 -- only reacted with functional dependencies
1577 -- arising from top-level instances.
1579 topReactionsStage :: SimplifierStage
1580 topReactionsStage workItem inerts
1581 = do { tir <- tryTopReact workItem
1584 return $ SR { sr_inerts = inerts
1585 , sr_new_work = emptyWorkList
1586 , sr_stop = ContinueWith workItem }
1587 SomeTopInt tir_new_work tir_new_inert ->
1588 return $ SR { sr_inerts = inerts
1589 , sr_new_work = tir_new_work
1590 , sr_stop = tir_new_inert
1594 tryTopReact :: WorkItem -> TcS TopInteractResult
1595 tryTopReact workitem
1596 = do { -- A flag controls the amount of interaction allowed
1597 -- See Note [Simplifying RULE lhs constraints]
1598 ctxt <- getTcSContext
1599 ; if allowedTopReaction (simplEqsOnly ctxt) workitem
1600 then do { traceTcS "tryTopReact / calling doTopReact" (ppr workitem)
1601 ; doTopReact workitem }
1602 else return NoTopInt
1605 allowedTopReaction :: Bool -> WorkItem -> Bool
1606 allowedTopReaction eqs_only (CDictCan {}) = not eqs_only
1607 allowedTopReaction _ _ = True
1609 doTopReact :: WorkItem -> TcS TopInteractResult
1610 -- The work item does not react with the inert set, so try interaction with top-level instances
1611 -- NB: The place to add superclasses in *not* in doTopReact stage. Instead superclasses are
1612 -- added in the worklist as part of the canonicalisation process.
1613 -- See Note [Adding superclasses] in TcCanonical.
1616 -- See Note [Given constraint that matches an instance declaration]
1617 doTopReact (CDictCan { cc_flavor = Given {} })
1618 = return NoTopInt -- NB: Superclasses already added since it's canonical
1620 -- Derived dictionary: just look for functional dependencies
1621 doTopReact workItem@(CDictCan { cc_flavor = Derived loc
1622 , cc_class = cls, cc_tyargs = xis })
1623 = do { fd_work <- findClassFunDeps cls xis loc
1624 ; if isEmptyWorkList fd_work then
1626 else return $ SomeTopInt { tir_new_work = fd_work
1627 , tir_new_inert = ContinueWith workItem } }
1628 -- Wanted dictionary
1629 doTopReact workItem@(CDictCan { cc_id = dv, cc_flavor = Wanted loc
1630 , cc_class = cls, cc_tyargs = xis })
1631 = do { -- See Note [MATCHING-SYNONYMS]
1632 ; lkp_inst_res <- matchClassInst cls xis loc
1633 ; case lkp_inst_res of
1635 do { traceTcS "doTopReact/ no class instance for" (ppr dv)
1636 ; fd_work <- findClassFunDeps cls xis loc
1637 ; return $ SomeTopInt
1638 { tir_new_work = fd_work
1639 , tir_new_inert = ContinueWith workItem } }
1641 GenInst wtvs ev_term -> -- Solved
1642 -- No need to do fundeps stuff here; the instance
1643 -- matches already so we won't get any more info
1644 -- from functional dependencies
1645 do { traceTcS "doTopReact/ found class instance for" (ppr dv)
1646 ; setDictBind dv ev_term
1647 ; inst_work <- canWanteds wtvs
1649 -- Solved in one step and no new wanted work produced.
1650 -- i.e we directly matched a top-level instance
1651 -- No point in caching this in 'inert'; hence Stop
1652 then return $ SomeTopInt { tir_new_work = emptyWorkList
1653 , tir_new_inert = Stop }
1655 -- Solved and new wanted work produced, you may cache the
1656 -- (tentatively solved) dictionary as Given! (used to be: Derived)
1657 else do { let solved = makeSolvedByInst workItem
1658 ; return $ SomeTopInt
1659 { tir_new_work = inst_work
1660 , tir_new_inert = ContinueWith solved } }
1664 doTopReact (CFunEqCan { cc_id = cv, cc_flavor = fl
1665 , cc_fun = tc, cc_tyargs = args, cc_rhs = xi })
1666 = ASSERT (isSynFamilyTyCon tc) -- No associated data families have reached that far
1667 do { match_res <- matchFam tc args -- See Note [MATCHING-SYNONYMS]
1671 MatchInstSingle (rep_tc, rep_tys)
1672 -> do { let Just coe_tc = tyConFamilyCoercion_maybe rep_tc
1673 Just rhs_ty = tcView (mkTyConApp rep_tc rep_tys)
1674 -- Eagerly expand away the type synonym on the
1675 -- RHS of a type function, so that it never
1676 -- appears in an error message
1677 -- See Note [Type synonym families] in TyCon
1678 coe = mkTyConApp coe_tc rep_tys
1680 Wanted {} -> do { cv' <- newWantedCoVar rhs_ty xi
1681 ; setWantedCoBind cv $
1682 coe `mkTransCoercion`
1685 Given {} -> newGivenCoVar xi rhs_ty $
1686 mkSymCoercion (mkCoVarCoercion cv) `mkTransCoercion` coe
1687 Derived {} -> newDerivedId (EqPred xi rhs_ty)
1688 ; can_cts <- mkCanonical fl cv'
1689 ; return $ SomeTopInt can_cts Stop }
1691 -> panicTcS $ text "TcSMonad.matchFam returned multiple instances!"
1695 -- Any other work item does not react with any top-level equations
1696 doTopReact _workItem = return NoTopInt
1698 ----------------------
1699 findClassFunDeps :: Class -> [Xi] -> WantedLoc -> TcS WorkList
1700 -- Look for a fundep reaction beween the wanted item
1701 -- and a top-level instance declaration
1702 findClassFunDeps cls xis loc
1703 = do { instEnvs <- getInstEnvs
1704 ; let eqn_pred_locs = improveFromInstEnv (classInstances instEnvs)
1705 (ClassP cls xis, pprArisingAt loc)
1706 ; derived_evs <- mkDerivedFunDepEqns loc eqn_pred_locs
1707 -- NB: fundeps generate some wanted equalities, but
1708 -- we don't use their evidence for anything
1709 ; cts <- mapM mkCanonicalFEV derived_evs
1710 ; return $ unionManyBags cts }
1714 Note [FunDep and implicit parameter reactions]
1715 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1716 Currently, our story of interacting two dictionaries (or a dictionary
1717 and top-level instances) for functional dependencies, and implicit
1718 paramters, is that we simply produce new wanted equalities. So for example
1720 class D a b | a -> b where ...
1726 We generate the extra work item
1728 where 'cv' is currently unused. However, this new item reacts with d2,
1729 discharging it in favour of a new constraint d2' thus:
1731 d2 := d2' |> D Int cv
1732 Now d2' can be discharged from d1
1734 We could be more aggressive and try to *immediately* solve the dictionary
1735 using those extra equalities. With the same inert set and work item we
1736 might dischard d2 directly:
1739 d2 := d1 |> D Int cv
1741 But in general it's a bit painful to figure out the necessary coercion,
1742 so we just take the first approach. Here is a better example. Consider:
1743 class C a b c | a -> b
1745 [Given] d1 : C T Int Char
1746 [Wanted] d2 : C T beta Int
1747 In this case, it's *not even possible* to solve the wanted immediately.
1748 So we should simply output the functional dependency and add this guy
1749 [but NOT its superclasses] back in the worklist. Even worse:
1750 [Given] d1 : C T Int beta
1751 [Wanted] d2: C T beta Int
1752 Then it is solvable, but its very hard to detect this on the spot.
1754 It's exactly the same with implicit parameters, except that the
1755 "aggressive" approach would be much easier to implement.
1757 Note [When improvement happens]
1758 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1759 We fire an improvement rule when
1761 * Two constraints match (modulo the fundep)
1762 e.g. C t1 t2, C t1 t3 where C a b | a->b
1763 The two match because the first arg is identical
1765 * At least one is not Given. If they are both given, we don't fire
1766 the reaction because we have no way of constructing evidence for a
1767 new equality nor does it seem right to create a new wanted goal
1768 (because the goal will most likely contain untouchables, which
1769 can't be solved anyway)!
1771 Note that we *do* fire the improvement if one is Given and one is Derived.
1772 The latter can be a superclass of a wanted goal. Example (tcfail138)
1773 class L a b | a -> b
1774 class (G a, L a b) => C a b
1776 instance C a b' => G (Maybe a)
1777 instance C a b => C (Maybe a) a
1778 instance L (Maybe a) a
1780 When solving the superclasses of the (C (Maybe a) a) instance, we get
1781 Given: C a b ... and hance by superclasses, (G a, L a b)
1783 Use the instance decl to get
1785 The (C a b') is inert, so we generate its Derived superclasses (L a b'),
1786 and now we need improvement between that derived superclass an the Given (L a b)
1788 Note [Overriding implicit parameters]
1789 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1791 f :: (?x::a) -> Bool -> a
1793 g v = let ?x::Int = 3
1794 in (f v, let ?x::Bool = True in f v)
1796 This should probably be well typed, with
1797 g :: Bool -> (Int, Bool)
1799 So the inner binding for ?x::Bool *overrides* the outer one.
1800 Hence a work-item Given overrides an inert-item Given.
1802 Note [Given constraint that matches an instance declaration]
1803 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1804 What should we do when we discover that one (or more) top-level
1805 instances match a given (or solved) class constraint? We have
1808 1. Reject the program. The reason is that there may not be a unique
1809 best strategy for the solver. Example, from the OutsideIn(X) paper:
1810 instance P x => Q [x]
1811 instance (x ~ y) => R [x] y
1813 wob :: forall a b. (Q [b], R b a) => a -> Int
1815 g :: forall a. Q [a] => [a] -> Int
1818 will generate the impliation constraint:
1819 Q [a] => (Q [beta], R beta [a])
1820 If we react (Q [beta]) with its top-level axiom, we end up with a
1821 (P beta), which we have no way of discharging. On the other hand,
1822 if we react R beta [a] with the top-level we get (beta ~ a), which
1823 is solvable and can help us rewrite (Q [beta]) to (Q [a]) which is
1824 now solvable by the given Q [a].
1826 However, this option is restrictive, for instance [Example 3] from
1827 Note [Recursive dictionaries] will fail to work.
1829 2. Ignore the problem, hoping that the situations where there exist indeed
1830 such multiple strategies are rare: Indeed the cause of the previous
1831 problem is that (R [x] y) yields the new work (x ~ y) which can be
1832 *spontaneously* solved, not using the givens.
1834 We are choosing option 2 below but we might consider having a flag as well.
1837 Note [New Wanted Superclass Work]
1838 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1839 Even in the case of wanted constraints, we may add some superclasses
1840 as new given work. The reason is:
1842 To allow FD-like improvement for type families. Assume that
1844 class C a b | a -> b
1845 and we have to solve the implication constraint:
1847 Then, FD improvement can help us to produce a new wanted (beta ~ b)
1849 We want to have the same effect with the type family encoding of
1850 functional dependencies. Namely, consider:
1851 class (F a ~ b) => C a b
1852 Now suppose that we have:
1855 By interacting the given we will get given (F a ~ b) which is not
1856 enough by itself to make us discharge (C a beta). However, we
1857 may create a new derived equality from the super-class of the
1858 wanted constraint (C a beta), namely derived (F a ~ beta).
1859 Now we may interact this with given (F a ~ b) to get:
1861 But 'beta' is a touchable unification variable, and hence OK to
1862 unify it with 'b', replacing the derived evidence with the identity.
1864 This requires trySpontaneousSolve to solve *derived*
1865 equalities that have a touchable in their RHS, *in addition*
1866 to solving wanted equalities.
1868 We also need to somehow use the superclasses to quantify over a minimal,
1869 constraint see note [Minimize by Superclasses] in TcSimplify.
1872 Finally, here is another example where this is useful.
1876 class (F a ~ b) => C a b
1877 And we are given the wanteds:
1881 We surely do *not* want to quantify over (b ~ c), since if someone provides
1882 dictionaries for (C a b) and (C a c), these dictionaries can provide a proof
1883 of (b ~ c), hence no extra evidence is necessary. Here is what will happen:
1885 Step 1: We will get new *given* superclass work,
1886 provisionally to our solving of w1 and w2
1888 g1: F a ~ b, g2 : F a ~ c,
1889 w1 : C a b, w2 : C a c, w3 : b ~ c
1891 The evidence for g1 and g2 is a superclass evidence term:
1893 g1 := sc w1, g2 := sc w2
1895 Step 2: The givens will solve the wanted w3, so that
1896 w3 := sym (sc w1) ; sc w2
1898 Step 3: Now, one may naively assume that then w2 can be solve from w1
1899 after rewriting with the (now solved equality) (b ~ c).
1901 But this rewriting is ruled out by the isGoodRectDict!
1903 Conclusion, we will (correctly) end up with the unsolved goals
1906 NB: The desugarer needs be more clever to deal with equalities
1907 that participate in recursive dictionary bindings.
1910 data LookupInstResult
1912 | GenInst [WantedEvVar] EvTerm
1914 matchClassInst :: Class -> [Type] -> WantedLoc -> TcS LookupInstResult
1915 matchClassInst clas tys loc
1916 = do { let pred = mkClassPred clas tys
1917 ; mb_result <- matchClass clas tys
1919 MatchInstNo -> return NoInstance
1920 MatchInstMany -> return NoInstance -- defer any reactions of a multitude until
1921 -- we learn more about the reagent
1922 MatchInstSingle (dfun_id, mb_inst_tys) ->
1923 do { checkWellStagedDFun pred dfun_id loc
1925 -- It's possible that not all the tyvars are in
1926 -- the substitution, tenv. For example:
1927 -- instance C X a => D X where ...
1928 -- (presumably there's a functional dependency in class C)
1929 -- Hence mb_inst_tys :: Either TyVar TcType
1931 ; tys <- instDFunTypes mb_inst_tys
1932 ; let (theta, _) = tcSplitPhiTy (applyTys (idType dfun_id) tys)
1933 ; if null theta then
1934 return (GenInst [] (EvDFunApp dfun_id tys []))
1936 { ev_vars <- instDFunConstraints theta
1937 ; let wevs = [EvVarX w loc | w <- ev_vars]
1938 ; return $ GenInst wevs (EvDFunApp dfun_id tys ev_vars) }