Import modules properly
From HaskellWiki
(Prelude) |
(Clashing of abbreviations) |
||
| Line 39: | Line 39: | ||
it should be safe to use the <hask>hiding</hask> clause when importing <hask>Prelude</hask>. | it should be safe to use the <hask>hiding</hask> clause when importing <hask>Prelude</hask>. | ||
Actually if you do not mention Prelude it will be imported anonymously. | Actually if you do not mention Prelude it will be imported anonymously. | ||
| + | |||
| + | == Clashing of abbreviations == | ||
| + | |||
| + | In Haskell it is possible to use the same abbreviation for different modules: | ||
| + | <haskell> | ||
| + | import qualified Data.List as List | ||
| + | import qualified Data.List.Extra as List | ||
| + | </haskell> | ||
| + | This is discouraged for the same reasons as above: | ||
| + | |||
| + | Stylistic reason: | ||
| + | The identifier <hask>List.intercalate</hask> may refer to either <hask>Data.List</hask> or <hask>Data.List.Extra</hask>. | ||
| + | You have to check these modules in order to find it out. | ||
| + | |||
| + | Compatibility reason: | ||
| + | The function <hask>List.intercalate</hask> may be currently defined only in <hask>Data.List.Extra</hask>. | ||
| + | However after many people found it useful, it is also added to <hask>Data.List</hask>. | ||
| + | Then <hask>List.intercalate</hask> can no longer be resolved. | ||
| + | |||
== See also == | == See also == | ||
Revision as of 21:21, 7 January 2009
Haskell has a lot of variants of importing identifiers from other modules. However not all of them are as comfortable as they seem to be at the first glance. We recommend to focus on the following two forms of import:
import qualified Very.Special.Module as VSM import Another.Important.Module (printf)
instead of
import Very.Special.Module import Another.Important.Module hiding (open, close)
Stylistic reason:
If you readCompatibility reason: In the second case, if new identifiers are added to the imported modules they might clash with names of other modules. Thus updating imported modules may break your code.
It may also be thatand with a module update removing that identifier, your import fails. That is, an identifier that you never needed but only annoyed you, annoys you again, when it was meant to not bother you any longer! The first variant of import does not suffer from these problems.
Correctness reason: I once found a bug in the StorableVector package by converting anonymous imports to explicit imports.
I found out that the functionalthough functions from this module always have to calcuate with unit "element" not "byte".
That is,A misbehaviour could only be observed for sub-vectors and elements with size greater than 1 byte. The test suite did miss that.
1 Exception from the rule
Since the Prelude is intended to be fixed for the future,
it should be safe to use theActually if you do not mention Prelude it will be imported anonymously.
2 Clashing of abbreviations
In Haskell it is possible to use the same abbreviation for different modules:
import qualified Data.List as List import qualified Data.List.Extra as List
This is discouraged for the same reasons as above:
Stylistic reason:
The identifierYou have to check these modules in order to find it out.
Compatibility reason:
The function
