This patch makes
(s1~t1) == (s2~t2) iff s1==s2, t1==t2
The comparison and equality instances for Insts are really only
used in making the AvailEnv in TcSimplify, which equalities are
never put into, which is why we've gotten away with this for so long.
But I'm now using 'nub' in the error messages for equalities,
and in any case it makes sense to have the right equality!
\begin{code}
instance Ord Inst where
\begin{code}
instance Ord Inst where
+ compare = cmpInst
+ -- Used *only* for AvailEnv in TcSimplify
instance Eq Inst where
(==) i1 i2 = case i1 `cmpInst` i2 of
instance Eq Inst where
(==) i1 i2 = case i1 `cmpInst` i2 of
cmpInst (ImplicInst {}) _ = LT
-- same for Equality constraints
cmpInst (ImplicInst {}) _ = LT
-- same for Equality constraints
-cmpInst (EqInst {}) (Dict {}) = GT
-cmpInst (EqInst {}) (Method {}) = GT
-cmpInst (EqInst {}) (LitInst {}) = GT
-cmpInst (EqInst {}) (ImplicInst {}) = GT
-cmpInst i1@(EqInst {}) i2@(EqInst {}) = tci_name i1 `compare` tci_name i2
+cmpInst (EqInst {}) (Dict {}) = GT
+cmpInst (EqInst {}) (Method {}) = GT
+cmpInst (EqInst {}) (LitInst {}) = GT
+cmpInst (EqInst {}) (ImplicInst {}) = GT
+cmpInst i1@(EqInst {}) i2@(EqInst {}) = (tci_left i1 `tcCmpType` tci_left i2) `thenCmp`
+ (tci_right i1 `tcCmpType` tci_right i2)