
3. As (2), but the full name of a module is not fixed in the source code, and can be mapped into the hierarchy at multiple places.
[...]
This suffers from (a) extra complication in the implementation and specification of the language,
I wonder if the extra complication is really that high. Suppose that every module somehow has a unique name (128 bit hash, global registry, whatever) and that we have setup two mappings to the same thing: Foo.Bar -> Reid.Consulting.Bar.version27 Baz.Bar -> Reid.Consulting.Bar.version27 to implement this in Hugs, it is _almost_ enough to simply run all source code through a preprocessor which replaces occurences of Foo.Bar and Baz.Bar with Reid.Consulting.Bar.version27. Suppose a module imports both Foo.Bar and Baz.Bar. The Haskell compiler will see this as two imports of Reid.Consulting.Bar.version27 and will recognise that any types they define are the same type. This simple minded lexical substitution approach would fail in the usual places that applying a preprocessor fails: inside strings, when a module name is also used as a constructor name, etc. It would also interact with qualified import. For this reason, the substitution needs to happen inside the parser or early parts of the frontend. We'd also want to generate good error messages so there would be a small change there as well. Overall, I think it would be quite a small change.
(b) needing unique package names,
The original proposal tied this feature strongly to packages. I wonder if this is really necessary. Putting that aside, it seems that unique package names are fairly easy to come by. Some possibilities are: 1) Use the URI of the primary download site. From choice, the URI would be for a tarfile or whatever but all that really matters is that it is unique. This will typically include a version number but, if not, the user could add one if they care. 2) In the likely event that we have a few big repositories and many small ones, simply prefix the name of the package by the repository name or, if not available, name of author. This is effectively the same as (1) but avoids using URIs. 3) Directory name on your system. This would be a little like the current situation with Hugs where you add -P options to the command line to add each package to the searchpath.
(c) referring unambiguously to a specific library must be done by GUID.
Rephrasing this as 'can be done by GUID', I would list this as a strength. -- Alastair Reid