
On Wed, Sep 24, 2008 at 09:28:04AM -0700, Jonathan Cast wrote:
On Wed, 2008-09-24 at 17:30 +0100, Claus Reinke wrote:
(sorry for the delay in replying to this...)
No problem, though you seem to be restating your opinion intead of addressing my concrete points? For those who, like me, have lost the thread in the meantime, here is a link to the message you reply to:
http://www.haskell.org/pipermail/libraries/2008-September/010623.html
.., the only sensible way to think about instances is as global properties. ..it has nothing to do with bugs or misfeatures in GHC, it's a fact of Haskell 98.
I thought my example demonstrated quite clearly that instances are *not* global in Haskell.
A type class specifies a relation between types. Both the types and the class are named, and if instances are placed in separate modules, the modules are named as well. The combination of module, class and type names gives quite a bit of control over instance import/export, even if it is terribly cumbersome and limited (and easily defeated by just one library importing all instances "for convenience"). Neither the relation (class), nor its domain (types), nor its extent (instances) are "global".
The point is that instances are unconditionally re-exported,
Yes, and I'm not disputing that point. What I am disputing are its consequences/interpretation. As I said, instances accumulate upwards along the import hierarchy. But they do not propagate downwards, so they do not have global scope, and one can exert some control over all of type relation (class), domain (types), and extent (instances).
What one cannot do (in Haskell 98) is to have two instances of the same class, for the same types, in the same import hierarchy.
Of course, when you consider that Main, by definition, imports every module in the program directly or indirectly, this is pretty close to saying `instances are global'. Isn't it?
No, because the Main module has a choice to only import certain modules. Thus when orphan instances are defined, we may have a choice of which instances we want to use. David