A package is the unit of distribution for the Cabal. Its purpose, when installed, is to make available either or both of:
A library, exposing a number of Haskell modules. A library may also contain hidden modules, which are used internally but not available to clients.
One or more Haskell programs.
However having both a library and executables in a package does not work very well; if the executables depend on the library, they must explicitly list all the modules they directly or indirectly import from that library.
Internally, the package may consist of much more than a bunch of Haskell modules: it may also have C source code and header files, source code meant for preprocessing, documentation, test cases, auxiliary tools etc.
A package is identified by a globally-unique
package name, which consists of one or
more alphanumeric words separated by hyphens. To avoid ambiguity,
each of these words should contain at least one letter.
Chaos will result if two distinct packages with the
same name are installed on the same system, but there is not
yet a mechanism for allocating these names.
A particular version of the package is distinguished by a
version number, consisting of a sequence
of one or more integers separated by dots. These can be combined
to form a single text string called the package
ID, using a hyphen to separate the name from the
version, e.g. “
Packages are not part of the Haskell language; they simply populate the hierarchical space of module names. In GHC 6.6 and later a program may contain multiple modules with the same name if they come from separate packages; in all other current Haskell systems packages may not overlap in the modules they provide, including hidden modules.
 Hugs doesn't support module hiding.