RE: [Haskell] Hierarchical module namespaceextensionnotsufficiently flexible

On 11 March 2005 10:56, Simon Peyton-Jones wrote:
module A (qualified module A) where { f = 'f' } module B (module A) where { import A; ... } module C where { import B; ... }
How do we refer to 'f' in B? I think the proposal suggests "A.f" or "A.A.f". How do we refer to 'f' in C? I think the proposal suggests that "f" is not in scope in C. The reason is that "B" does not export "f", because there is no "f" and "A.f" in scope.
Correct, according to the rules I suggested.
It seems that we cannot re-export qualified exports using module-style exports. Is this the intended design choice, or am I missing something?
Hmm. If you said
module B( module A.A ) where { import A; ... }
then since A.A.f and A.f are in scope, presumably A.f is exported, just as it was from A.
I'm not sure about that... the exact wording of the report is: The form "module M" names the set of all entities that are in scope with both an unqualified name e and a qualified name M.e If M is A.A, then both A.A.f and f need to be in scope, which they aren't in this example. But, going back to the original example: module A (qualified module A) where { f = 'f' } module B (module A) where { import A; ... } if we take e==A.f, then by the report's rule, module B exports A.f. So, the rule in the report works if we allow e to scope over qualified names. This is a bit of a hack, and it changes the meaning slightly even in the absence of 'qualified module' exports, so this might have some undesirable consequences. On the other hand, this interpretation does allow you to re-export *everything* from an imported module, including any names it exported via 'qualified module', which is what we want. To avoid confusion, here's a concrete proposal: ----------- 'qualified module A as B' exports the set of all entities e that are in scope as both e and A.e, as B.e. [John Meacham/SimonPJ suggestion] 'module A' exports the set of all entities e that are in scope as both e and A.e, as e. [Haskell 98] In both cases, e can scope over qualified names. [new addition] ------------ (restricting the exports with (..) or hiding (..) can be added too; I just left it out for simplicity). Here are some useful past threads: http://www.haskell.org/pipermail/haskell/2002-November/010662.html http://www.haskell.org/pipermail/haskell/2001-August/007674.html http://www.haskell.org/pipermail/haskell/2001-July/007515.html unfortunately I can't find exactly what I was looking for, namely the motivation that lead to the current clever rule for 'module M' exports. Cheers, Simon
participants (1)
-
Simon Marlow