[Haskell] Re: Top Level

wren ng thornton wren at community.haskell.org
Thu Jun 18 05:32:42 EDT 2009


Simon Marlow wrote:
> Where does that leave module names?  What are the advantages of having a 
> rigidly-defined module hierarchy based on functionality classification? 
>  The only reasons I can think of are:
> 
>  * Choosing module names based on some generally agreed-upon
>    guidelines makes it less likely that one package's module names
>    will clash with another.

+1.


>  * Packages that are conglomerations of different kinds of functionality
>    (e.g. base) benefit from functionality-based module naming.

+1.


>  * Source code doesn't refer to packages, it only refers to module
>    names.  So if you're trying to understand a piece of source code, it
>    helps if the module names it imports are descriptive and unique.  On
>    the other hand, a module name tells you nothing of the provenance
>    or the version of the module it refers to, so arguably source code
>    without its dependencies is already less than useful.
> 
> So why shouldn't OpenGL be naming its modules OpenGL.*, rather than 
> Graphics.Rendering.OpenGL.*?  Personally, I can't think of any 
> sufficiently compelling reasons any more.

I think at this stage in the game, OpenGL.* is probably better. The way 
I see it there are two rather different kinds of modules (or module 
collections):

* For module collections which have high utility across many different 
packages/programs (e.g. Data.Map, Control.Monad), having 
functionality-based names is helpful for solving name-clash and 
functionality-discovering/remembering issues. These modules are truly 
stand-alone "libraries" and are extremely composable (with other module 
collections) and extremely decomposable (from module collection into the 
constituent modules).

* However, there are other collections of modules which are not 
"libraries" so much as "frameworks". While they're still (usually) 
composable, they're typically not decomposable. Often these are the 
results of taking an executable and shaving off some of the front-end 
details. Because of the non-decomposability, it makes sense to me to 
give each of these a top-level module name. Under the top-level they 
should be organized by functionality--- in the terms of the framework 
itself, not in the general terms shared by the "libraries".

If many very-similar frameworks are anticipated (in particular, when 
more than one may be used in a single project), then it makes sense to 
collect them under a common top-level name. Test.* is a good example of 
this, though possibly the only one (or maybe Reactive.* as well). I'm 
not sure that I see rendering as a functionality that's sufficiently 
widely-used with many competing frameworks where more than one would 
reasonably used in a single project, in order to merit the Rendering.* 
prefix (but I don't play here, so I could be wrong). The Graphics.* 
prefix strikes me as too generic and unhelpful since it doesn't "mean" 
anything exactly: we could have an ASCII Art image renderer, should that 
be under Graphics.Rendering.* or Text.Rendering.*?

-- 
Live well,
~wren


More information about the Libraries mailing list