
Another reason to prefer the global interpretation of instances is that it allows for more efficient, non-dictionary-passing implementations of type classes. Both JHC's type-case and Mark Jones's partial evaluation techniques require instances that are the same everywhere.
Why would partial evaluation require global instances? Mark's prototype implementation ignored separate compilation issues by requiring all modules to be available at specialisation time. But that does not imply that specialisation is limited to a one instance-per-program view, it just has to be clear which instance to specialise at any point. That needs to be clear for any implementation of type classes, with or without dictionaries, but the consequences differ slighly: in a dictionary-based implementation, undecided instances mean dictionaries parameters, to be supplied at usage points; in a dictionary-free implementation, undecided instances mean general code, to be specialised at usage points. Right? Claus