[Haskell-cafe] Re: change in overlapping instance behavior between GHC 6.12 and GHC 7 causes compilation failure

Neil Brown nccb2 at kent.ac.uk
Tue Nov 9 07:08:50 EST 2010


On 09/11/10 11:53, Neil Brown wrote:
> XMLGenerator.lhs:64:16:
>     Overlapping instances for EmbedAsChild
>                                 (IdentityT IO) (XMLGenT m (XML m))
>       arising from a use of `asChild' at XMLGenerator.lhs:64:16-22
>     Matching instances:
>       instance [overlap ok] (XML m ~ x, XMLGen m) => EmbedAsChild m x
>         -- Defined at XMLGenerator.lhs:37:11-52
>       instance [overlap ok] (EmbedAsChild m c) =>
>                             EmbedAsChild m (XMLGenT m c)
>         -- Defined at XMLGenerator.lhs:31:11-60
>
I think I should expand slightly more on this bit, especially since I 
chopped off the useful line "The choice depends on the instantiation of 
`m'".  The problem is that depending on the choice of m in the instance 
(the "EmbedAsChild (IdentityT IO) (XMLGenT m (XML m))" part), you may or 
may not match the second overlapping instance.  If you choose 
m=IdentityT IO then it matches the second instance, if you choose 
anything else then it won't, so GHC can't tell at this point which 
instance to choose.  Which makes them not just overlapping, but also 
leaves no clear choice (which is why it prompts you to use 
IncoherentInstances).  When you typed the genElement "foo" part 
explicitly and gave a type to the monad m, that fixed the ambiguity.  So 
I think it's not even that you needed incoherent instances, you have an 
unresolvable ambiguity if the type of m is left to be inferred.  So I 
still think the question is why the old instance with the "~" worked fine.

(Does this help, or am I telling you what you've already worked out for 
yourself?)

Thanks,

Neil.


More information about the Haskell-Cafe mailing list