Instance declarations and class exports
Simon Peyton-Jones
simonpj@microsoft.com
Tue, 11 Dec 2001 02:07:39 -0800
Folks,
Iavor has made two excellent points, upon which I have been
ruminating (and consulting). Consider
module Foo( M.Ix( index ) ) where
import qualified Ix as M( Ix )
import qualified Ix as T( index )
instance M.Ix MyType where
index a =3D ...
index v =3D ... -- A local declaration
Notice that:
* The Ix class is in scope as "M.Ix", but
its index method is in scope ias "T.index". =20
* Nevertheless, it's 100% clear what we mean in the
instance declaration
* It's also 100% clear what we mean in the export list
M.Ix( index )
(The report is currently silent about whether this is legal.)
* These two situations are very similar, and should be=20
resolved in the same way
* I think we all agree that it woudl be illegal to mention
the 'range' method of the Ix class, either in the
instance cecl, or in theexport list.
Why? Because 'range' is not imported.
I therefore want to propose:
1. "subordinate" names in export lists are always unqualified
Thus, we can have M.Ix( index ), but not M.Ix( T.index ).
2. A subordinate name in an export list is legal if the entity (class
operation or data constructor) is in scope in the module, regardless
of whether it is in scope under a qualified or unqualified name. =20
(In the example, T.index.)
3. The exact same rule is used to determine whether the class method
name on the LHS of an instance-decl binding is legal.
This time I have implemented the rule first, and it seems fine.
These are basically clarifications. Objections? Comments?
I'd like to find a better wording for (2) above.
Simon