Re-Exporting Whole Modules
The above process of importing a specific list of symbols from another module and then listing each individual symbol to be re-exported gets tedious very quickly. It isn't uncommon to want to re-export all the symbols imported from a given module. To support this, GHC allows us to list the modules to be exported in the current module's export list, like so:
module Banner
( module Banner.StudentRecord
, module Banner.Transcript
, module Banner.Database
, module Banner.WebInterface
) where
import Banner.StudentRecord
(StudentRecord, bannerNumber, name, address, transcript)
import Banner.Transcript
(Transcript)
import Banner.Database
(retrieveRecords, storeRecords)
import Banner.WebInterface
(processWebQuery)
Using module A
in the export list of module B
is allowed only if B
imports
all of A
using
import A
or a list of specific symbols from A
using
import A (sym1, sym2, ...)
Listing module A
as an export of module B
then makes B
export all the
symbols it imports from A
. To be specific, it exports all symbols that are
imported unqualified from A
. Thus, while the
following module definition would be legal:
module B (module A) where
import qualified A
it would (usually) not export anything because all symbols imported from A
are
accessible only using their qualified names A.sym1
, A.sym2
, ....
I said "usually" just now because there is a weird corner case. Consider the following module definition
module B (module Data.List) where
import qualified Data.List
In this case, B
exports all those symbols from the Data.List
module that are
accessible using their unqualified names. Since every module automatically
imports the Prelude
, and the Prelude
includes some functions from
Data.List
, this definition of the module B
would actually lead to B
exporting some functions, namely exactly those that come from Data.List
and
which are also included in (re-exported by) the Prelude
. I'm not sure this is
the best possible behaviour, but I'm sure there is a reason why the Haskell
standard defines the behaviour of module exports in this manner.