overlapping instances and constraints
Claus Reinke
claus.reinke at talk21.com
Tue Feb 28 15:14:25 EST 2006
>> 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..
More information about the Haskell-prime
mailing list