[commit: ghc] type-nats: Prefer Wanteds over Derived when solving family equations: (62b03d0)
Iavor Diatchki
diatchki at galois.com
Mon Sep 17 03:03:03 CEST 2012
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : type-nats
http://hackage.haskell.org/trac/ghc/changeset/62b03d048ba69a573ea92c053d3e7cf2c1c88d93
>---------------------------------------------------------------
commit 62b03d048ba69a573ea92c053d3e7cf2c1c88d93
Author: Iavor S. Diatchki <iavor.diatchki at gmail.com>
Date: Sun Sep 16 15:19:56 2012 -0700
Prefer Wanteds over Derived when solving family equations:
If we have a choice of a wanted and derived equation, we prefer
the wanted one. To see why, consider the following example:
[D] b + a ~ c
[W] a + b ~ c
If we use the derived one, then `c` gets defined to `b + a` and we
are left with an unsolved wanted constraint because now `c` has
a binding. However, if we use the wanted first, then we are
left with an "unsolved" derived constraint, which is OK because
derived constraints don't correspond to goals that need to be solved.
(Indeed, it is likely that the derived constraint was generated
by the wanted, to enable reactions where the arguments
to (+) were swapped)
>---------------------------------------------------------------
compiler/typecheck/TcSimplify.lhs | 19 ++++++++++++++++++-
1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/compiler/typecheck/TcSimplify.lhs b/compiler/typecheck/TcSimplify.lhs
index c36ee43..1d48ebc 100644
--- a/compiler/typecheck/TcSimplify.lhs
+++ b/compiler/typecheck/TcSimplify.lhs
@@ -1239,7 +1239,11 @@ getSolvableCTyFunEqs :: TcsUntouchables
-> Cts -- Precondition: all Wanteds or Derived!
-> (Cts, FunEqBinds) -- Postcondition: returns the unsolvables
getSolvableCTyFunEqs untch cts
- = Bag.foldlBag dflt_funeq (emptyCts, emptyFunEqBinds) cts
+ = let (ws,ds) = partitionBag isWantedCt cts
+ s1 = Bag.foldlBag dflt_funeq (emptyCts, emptyFunEqBinds) ws
+ in Bag.foldlBag dflt_funeq s1 ds
+
+
where
dflt_funeq :: (Cts, FunEqBinds) -> Ct
-> (Cts, FunEqBinds)
@@ -1290,6 +1294,19 @@ When is it ok to do so?
3) Notice that 'beta' can't be bound in ty binds already because we rewrite RHS
of type family equations. See Inert Set invariants in TcInteract.
+ 4) If we have a choice of a wanted and derived equation, we prefer
+ the wanted one. To see why, consider the following example:
+ [D] b + a ~ c
+ [W] a + b ~ c
+ If we use the derived one, then `c` gets defined to `b + a` and we
+ are left with an unsolved wanted constraint because now `c` has
+ a binding. However, if we use the wanted first, then we are
+ left with an "unsolved" derived constraint, which is OK because
+ derived constraints don't correspond to goals that need to be solved.
+ (Indeed, it is likely that the derived constraint was generated
+ by the wanted, to enable reactions where the arguments
+ to (+) were swapped)
+
*********************************************************************************
* *
More information about the Cvs-ghc
mailing list