Folks The folk at OGI have continued the current trend of discovering unspecified corners of Haskell 98. That means taking some decisions, and, as ever, I don't want to do that without giving you all a chance to demur. Nevertheless, I doubt this'll be controversial, because it's all dark-corner stuff. | 1) Sec 5.3.1: In an "import A(x, ...)", the report tells us | that x must be one of the names exported from A. There is no | indication whether a similar rule applies to declarations | like "import A hiding (x, ...)" if x is not exported from A. I propose that hiding something that isn't exported should be considered an error. It's not actually harmful but it is misleading. | 2) The semantics of "module M" style entries in export lists seems to | be underspecified. Here are some programs to illustrate: | | Program 1: module A(module B, ...) where | ~~~~~~~~~~ ... code that doesn't import B ... | | Is this valid? We thought that it should probably be invalid, | but could also see an interpretation in which it was valid, but | with nothing exported for the "module B" part. By the same token, I think this should be an error. | Program 2: module A(module B, ...) where | ~~~~~~~~~~ import qualified B | ... code that doesn't import B ... | | A similar example: now B appears as an import, but there are no | unqualified imports of B, so either "module B" adds nothing to the | export list (except instances?), or else this program is an error. | | Item 5 on p65 (describing entities exported from modules) says that | "module m" exports entities brought into scope from m by one or more | *unqualified* imports. But this example suggests more; that it will | export instances brought into scope from *qualified* imports too. | Perhaps the intention is that "module m" exports all instances, | and all entities that are imported from m with an unqualified name? I don't think it should matter whether B is imported qualified or not; I propose to remove the *unqualified* adjective in the above quote. The export list specifies what is exported, and can include qualified names: module A( B.f ) where import qualified B So 'module B' in an export list means "everything imported from B" regardless of whether the things imported from B are known by a qualified or unqualified name. | Program 3: module A(module B, ...) where | ~~~~~~~~~~ import B as C | ... code that doesn't import again from (or as) B ... | | Program 4: module A(module B, ...) where | ~~~~~~~~~~ import C as B | ... code that doesn't import again from (or as) B ... | | Which of these is valid? Does the "B" in "module B" refer to the | literal name of the module from which entities are imported, the | local alias by which they are referenced, ... or both? Good question! Given import X as Y module X is known as Y throughout the importing module, so [proposal] I think it should be module Y that appears in the export list, not X. So a good summary of what is exported by "module Y" would be "every entity e for which Y.e is in scope". [Recall that everything is always imported qualified, and perhaps unqualified too.] Simon