Thanks for the reply. I don't quite understand why guessing whether there is an intermediate type would be so magical, though. Let's simplify:
data A
data B
class IsNotFirst a
class IsAfter b a
instance (IsAfter b a) => IsNotFirst a
instance IsAfter B A
Here we've separated out the ambiguous type issue from the unification. Note that *already*, if I query with undefined::(IsNotFirst A => a), I get:
No instance for (IsAfter b A) arising from a use of ‘t’
The type variable ‘b’ is ambiguous
Note: there is a potential instance available:
instance [overlap ok] IsAfter B A
Generally, GHC is doing the work that I wanted it to *in the error message*. In what sense, then, is this impossible?
And why is there some inexcusable use of CWA here? Instances already have (if you squint) a negation-as-failure semantics. "instance (IsAfter b a) => IsNotFirst a" doesn't *in that sense* look that different to me than "instance (IsSecond a) => IsNotFirst a": adding extra instance declarations can 'change the truth-value' of the right-hand side.
Thanks again,
Julian