Import
From HaskellWiki
(Difference between revisions)
(Added notes about the Prelude.) |
(explicitely say multiple imports are allowed; do some minor reorganizing) |
||
| (4 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
[[Category:Language]] | [[Category:Language]] | ||
| - | The <hask>import</hask> statement is used to import functions and other definitions from another module. | + | [[Category:Glossary]] |
| + | The <hask>import</hask> statement is used to import functions and other definitions from another module. The shortest form of the import statement is | ||
<haskell> | <haskell> | ||
import Data.Maybe | import Data.Maybe | ||
</haskell> | </haskell> | ||
| - | + | that imports the named module (in this case <hask>Data.Maybe</hask>). | |
| - | However, | + | However, there are more options: |
| - | + | # Modules can be imported '''qualified''' (forcing an obligatory namespace qualifier to imported identifiers). | |
| + | # Some identifiers can be skipped via the '''hiding''' clause. | ||
| + | # The module namespace can be renamed, with an '''as''' clause. | ||
| + | |||
| + | Getting all of this straight in your head is quite tricky, so here is a table (lifted directly from the language reference manual) that roughly summarises the various possibilities: | ||
| + | |||
| + | Supposing that the module <hask>Mod</hask> exports three functions named <hask>x</hask>, <hask>y</hask> and <hask>z</hask>... | ||
{| | {| | ||
| Line 57: | Line 64: | ||
|} | |} | ||
| - | Note | + | Note that multiple import statements for the same module are also allowed, so it is possible to mix and match styles if its so desired (for example, importing operators directly and functions qualified) |
| + | |||
| + | ===Hiding Prelude=== | ||
| + | |||
| + | By default, ''every module'' implicitly imports <hask>Prelude</hask>. However, if you add an ''explicit'' import declaration for the prelude, this turns off the implicit one. Thus, if you wanted (for example) to write a module that redefines <hask>zip</hask> you could do | ||
<haskell> | <haskell> | ||
module Mod where | module Mod where | ||
| Line 76: | Line 87: | ||
Note that any module ''using'' a module that redefines prelude functions will need to import either the prelude or the other module (or maybe both) qualified and/or with hiding for the same reason. | Note that any module ''using'' a module that redefines prelude functions will need to import either the prelude or the other module (or maybe both) qualified and/or with hiding for the same reason. | ||
| + | |||
| + | == See also == | ||
| + | |||
| + | * [[Import modules properly]] - Some thoughts that may help to decide what form of the import statement to use. | ||
Current revision
Theimport
import Data.Maybe
Data.Maybe
However, there are more options:
- Modules can be imported qualified (forcing an obligatory namespace qualifier to imported identifiers).
- Some identifiers can be skipped via the hiding clause.
- The module namespace can be renamed, with an as clause.
Getting all of this straight in your head is quite tricky, so here is a table (lifted directly from the language reference manual) that roughly summarises the various possibilities:
Supposing that the moduleMod
x
y
z
| Import command | What is brought into scope | Notes |
|---|---|---|
| import Mod | x, y, z, Mod.x, Mod.y, Mod.z | (By default, qualified and unqualified names.) |
| import Mod () | (Nothing!) | (Useful for only importing instances of typeclasses and nothing else) |
| import Mod (x,y) | x, y, Mod.x, Mod.y | (Only x y z |
| import qualified Mod | Mod.x, Mod.y, Mod.z | (Only qualified versions; no unqualified versions.) |
| import qualified Mod (x,y) | Mod.x, Mod.y | (Only x y |
| import Mod hiding (x,y) | z, Mod.z | ( x y |
| import qualified Mod hiding (x,y) | Mod.z | ( x y |
| import Mod as Foo | x, y, z, Foo.x, Foo.y, Foo.z | (Unqualified names as before. Qualified names use Foo Mod |
| import Mod as Foo (x,y) | x, y, Foo.x, Foo.y | (Only import x y |
| import qualified Mod as Foo | Foo.x, Foo.y, Foo.z | (Only qualified names, using new qualifier.) |
Note that multiple import statements for the same module are also allowed, so it is possible to mix and match styles if its so desired (for example, importing operators directly and functions qualified)
1 Hiding Prelude
By default, every module implicitly importsPrelude
zip
module Mod where import Prelude hiding (zip) zip = {- ... -}
import
zip
module Mod where import qualified Prelude as P zip = {- ... -}
P.show (2 P.+ 3 P.* 3) P.++ "abc"
Note that any module using a module that redefines prelude functions will need to import either the prelude or the other module (or maybe both) qualified and/or with hiding for the same reason.
2 See also
- Import modules properly - Some thoughts that may help to decide what form of the import statement to use.
