both hugs and ghc clearly specify that the more specific instance declaration is chosen when overlapping instance declarations are permitted.

I have trouble with this "more specific" term. It's not well-defined,
i.e. not a total order on possible instance declarations.

The point I was trying to make was that in the case where a
precondition (in this case, Fail a) does not apply, what stops the
resolution algorithm falling back on the other instance declaration?

preconditions (instance constraints) are not taken into account in
best-fit overlap resolution. the ordering is plain substitution: instance
A is more specific than instance B if there is a (non-empty) substitution that can be applied to make B's head identical to A's. where that is not possible, the overlapping declarations are not accepted. see, eg.:

http://www.haskell.org/ghc/dist/current/docs/users_guide/type-extensions.html#instance-overlap

in that sense, the flag name -fallow-overlapping-instances is slightly
misleading, because it really only permits a subset of overlaps - ones
that can be resolved unambiguously, using a substitution ordering of
the instance heads. it is always clear which instance to choose - no search, no backtracking.

cheers,
claus

ps people, including me, have argued the instance context ought to
   be taken into account. but again, that doesn't need to lead to
   much search - most of us would be happy if instance contexts
   would be required to uniquely determine the instance to be
chosen, a rather conservative extension of current practice.
   that is because we often use a pair of instance declarations
   where the context for one includes the negation of some of the
   context in the other - they are mutually exclusive, so everything
   is happily deterministic, but the implementation does not notice..

_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to