Commit 366e402d authored by simonpj@microsoft.com's avatar simonpj@microsoft.com

The Core type-matcher should look through PredTypes

The core type-matcher Unify.match was previouly using tcView to expand
types, because it must treat newtypes as distinct from their representation.
But that meant that it also treated the PredType {C Int} as distinct from
its representation type (:TC Int).  And that in turn was causing a rule
not to fire, because the argument types didn't match up.

For this to happen we need to get a situation where we have

  a = :DC blah blah	-- Dictionary
  ....(f a).....

Now a has type (:TC Int), bu the RULE for f expects an argument 
of type {C Int}.  Roman found that just this was happening.


parent decb48fc
......@@ -146,11 +146,12 @@ match :: MatchEnv -- For the most part this is pushed downwards
-- in-scope set of the RnEnv2
-> Type -> Type -- Template and target respectively
-> Maybe TvSubstEnv
-- This matcher works on source types; that is,
-- it respects NewTypes and PredType
-- This matcher works on core types; that is, it ignores PredTypes
-- Watch out if newtypes become transparent agin!
-- this matcher must respect newtypes
match menv subst ty1 ty2 | Just ty1' <- tcView ty1 = match menv subst ty1' ty2
| Just ty2' <- tcView ty2 = match menv subst ty1 ty2'
match menv subst ty1 ty2 | Just ty1' <- coreView ty1 = match menv subst ty1' ty2
| Just ty2' <- coreView ty2 = match menv subst ty1 ty2'
match menv subst (TyVarTy tv1) ty2
| tv1' `elemVarSet` me_tmpls menv
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment