Instance declarations and class exports

Simon Peyton-Jones
Tue, 11 Dec 2001 02:07:39 -0800


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.