#4485: Unexplained change in type-inference + OverlappingInstances in
---------------------------------+------------------------------------------
Reporter: JeremyShaw | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.0.1 RC1
Keywords: | Testcase:
Blockedby: | Difficulty:
Os: Unknown/Multiple | Blocking:
Architecture: Unknown/Multiple | Failure: GHC rejects valid program
---------------------------------+------------------------------------------
Comment(by simonpj):
Thanks for the example. GHC 7 isn't behaving well here, but 6.12 may be
behaving even worse.
Look at the typing problem that arises from
{{{
instance EmbedAsChild (IdentityT IO) FooBar where
asChild b = asChild $ (genElement "foo")
}}}
After a bit of figuring, you should see that we have to solve the
following type constraints:
{{{
EmbedAsChild (IdentityT IO) (XMLGen meta (XML meta)
XMLGen meta
}}}
where `meta` is an unknown unification variable arising from instantiating
the call to `genElement :: `XMLGen m => String -> XMLGenT m (XML m)`.
There are no other constraints on `meta`. OK, so now how is GHC supposed
to figure out what `meta` is? Well, there are four instance declarations
(each with a different context, but that doesn't matter here):
{{{
EmbedAsChild (IdentityT IO) FooBar
EmbedAsChild (IdentityT IO) (XMLGenT Identity ())
EmbedAsChild m (XMLGenT m1 c)
EmbedAsChild m x
}}}
Remember, we have to match without knowing what `meta` is going to turn
out to be. The first cannot match, but the latter three in principle
could, depending on how `meta` is eventually instantiated. The fourth is
ignored becuase the third is more specific.
So there you are: we don't know which one to pick. In GHC 7 the error
message is wrong, because it only mentions one of the two.
I'm honestly not sure why 6.12 accepts this.
So: what is your reasoning that says `meta` cannot instantite to
`Identity`. Maybe you reason that `XML Identity` does not reduce to `()`,
but that is very fragile. You might add such an instance declaration. And
in any case it's beyond GHC's instance-matching powers to figure that out.
But perhaps you have an intutition in mind?
Simon
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4485#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs