[Haskell-cafe] Are explicit exports and local imports desirable in a production application?

Henning Thielemann lemming at henning-thielemann.de
Wed Sep 16 17:36:35 UTC 2020

On Wed, 16 Sep 2020, Ignat Insarov wrote:

> ### Explicit exports.
> When there are no explicit exports, everything is exported from a
> module. Recall a case when this is disadvantageous: abstract types.
> The values of abstract types must only be obtained via smart
> constructors. So their definitions should not be made available.
> Explicit exports may provide that.

You can do the following in Cabal:

Library private
    Exposed-Modules: A.Internal

    Exposed-Modules: A
    Build-Depends: private

Test-Suite foobar-test
    Build-Depends: private

This way you can export the constructors of a datatype from A.Internal and 
use them in A and in the test-suite, but the user of your package cannot 
access them.

> ### Explicit imports.
> Recall the scenario in which explicit imports are useful.
> * A module `"p" X` from package `p` imports a module `"q" Y` from
> package `q v0.0.0`.
> * The package `q` bumps the third version number and exports a
> definition `Y.d` which name coincides with an already defined
> definition `X.d`.

I would not distinguish between imports between modules from the same and 
from other packages, because in the course of refactoring you might want 
to split a package. Instead I write all my modules with qualified imports 
in mind, such that I can write e.g. Window.open instead of openWindow. 
E.g. 'containers' is a good pattern to follow.

More information about the Haskell-Cafe mailing list