Yes indeed, this is one of those "well-known" (ie not at all well
known, but folk lore) problems with overlapping instances, at least in
programs where different instances can be in scope at different times.

I think these examples are subtly different (eg, some trip up Hugs as
well, some only GHC), and it would be nice to have a collection of such
folk lore. Currently, GHC's trac is probably the best approximation, but
it would be more useful to have a collection of examples interpreted
differently by different Haskell implementations.

1) Iavor's example exploits the special early treatment of superclass
 constraints to trigger an early commit (excluding later, more specific
 overlaps), and trips up both Hugs and GHC.

2) Simon's variation exploits explicit type signatures to trigger an
 early commit. As given, it trips up both Hugs and GHC, but if we
 remove the explicit type signature for f, Hugs recovers while GHC
 still misses the more specific instance (Simon: this seems to be a
 regression in 6.9 wrt to 6.6.1? [*]).

3) Simon's multiple instance example exploits GHC's late treatment of overlap errors, only trips up GHC, and -in its Haskell 98, no-overlapping-instances incarnation- is in direct violation of the
 language report (GHC trac ticket #2356)

Both 1 and 2 seem to be caused by a specific dictionary translation.
Haskell 98 requires an early superclass check, and does not need
to require that the superclass instance found for that check is the one
used at every point of use, because -in Haskell 98- there can be
only one such instance. For implementations supporting overlapping instances, it seems quite possible to use one superclass instance for the superclass constraint check, but another, more specific superclass instance for each actual use - just that the usual dictionary translation doesn't have that flexibility as it fixes the instance to use at the point of definition, where superclass constraint or explicit signature are checked.

Claus

[*] -- 6.6.1
   *B> :t f
   f :: (Name [t]) => t -> String

   -- 6.9.20080217
   *B> :t f
   f :: (Name t) => t -> String

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

Reply via email to