Export lists in modules

Ketil Malde ketil+haskell at ii.uib.no
Fri Feb 24 03:20:10 EST 2006

Malcolm Wallace <Malcolm.Wallace at cs.york.ac.uk> writes:

> One of the problems with the current mechanism for overriding Prelude
> definitions, is that every module that /uses/ such an entity must
> also explicitly hide the original Prelude:

I guess I don't quite understand what you are trying to achieve.

Case one: existing project where you want to replace the Prelude

  Subcase a: the project already has a dummy module MyPrelude which just
             reexports the Prelude, and which is imported everywhere.  
             - Great, all you need to do is modify MyPrelude!
             - Benefit from your proposal: you could skip import
               Prelude () from all .hs files (or -fno-implicit-prelude
               from your Makefile)
             - Drawback: anybody actually *do* this in real code
               without concrete plans for Prelude replacement?

  Subcase b: you don't have a MyPrelude.
             - Too bad, you need to modify all your .hs files *anyway*
             (Unless the good and benevolent secret keepers of the
             compiler code would implement a -fprelude-is MyPrelude 

  Subcase c: you want an alternative Prelude only in some of your
             files.  Well, you are going to need to modify those files.
             At least you get to leave the rest alone.           

Case two: a new project with a different Prelude

    Well, if you're starting a new project, you can of course 
    choose your own imports as you wish.  Currently, the cost
    in one extra line in each file or the -fno-implicit option. 
I don't think saving one line from each file in projects using
alternative Preludes justify adding one line to each file in projects
using the standard Prelude.  If there is any reason to think custom
Preludes will outnumber the standard one, I'll change my mind.

This sounds like yet another feature that is greatly interesting and
wonderful to language hackers, and mostly annoying to the average
programmer - partly by requiring extra overhead and boilerplate stuff,
and partly by breaking old code.

To summarize:

* I don't think this is a good solution to name clashes; to use
e.g. Set (and, hey, I agree with Okasaki and you that it should
probably be used more instead of lists) I would need to use
fine-grained imports management which adds administrative overhead.

(A simple rename of a couple of offending identifiers would solve the
problem. Why not 'isEmpty' instead of 'null', for instance?)

* The standard Prelude is IMO going to be vastly more common than
custom replacements.  Custom Prelude users are also likely to be more
accomplished Haskell programmers.  Any administrative burden should be
on the custom Prelude users.

* That said, I'm all in favor of a switch to tell the compiler to use
a custom module instead of the implicit Prelude.  Or perhaps more
generally: provide an implicit, project-wide import?  Something like:

   ghc --make -fno-implicit-prelude -fimplicit-import MyPrelude Main.hs 

* Much of my resistance would go away if I had better tools to manage
module interfaces more automatically.  As it is now, import/export
administration is already enough of a chore to be noticeable.

If I haven't seen further, it is by standing in the footprints of giants

More information about the Haskell-prime mailing list