I understand import Data.List
.
But what does qualified
mean in the statement import qualified Data.List
?
A qualified import makes the imported entities available only in qualified form, e.g.
import qualified Data.List
result :: [Int]
result = Data.List.sort [3,1,2,4]
With just import Data.List
, the entities are available in qualified form and in unqualified form. Usually, just doing a qualified import leads to too long names, so you
import qualified Data.List as L
result :: [Int]
result = L.sort [3,1,2,4]
A qualified import allows using functions with the same name imported from several modules, e.g. map
from the Prelude
and map
from Data.Map
.
If you do an unqualified import (the default), you can refer to anything imported just by its name.
If you do a qualified import, you have to prefix the name with the module it's imported from.
E.g.,
import Data.List (sort)
This is an unqualified import. You can now say either sort
or Data.List.sort
.
import qualified Data.List (sort)
This is a qualified import. Now sort
by itself doesn't work, and you have to say Data.List.sort
.
Because that's quite lengthy, normally you say something like
import qualified Data.List (sort) as LS
and now you can write LS.sort
, which is shorter.
The keyword qualified
means that symbols in the imported modules are not imported into the unqualified (prefixless) namespace. They are only available with their full qualified name. For instance, foldr'
has the unqualified name foldr'
and the qualified name Data.List.foldr'
.
One uses qualified imports to prevent namespace pollution. It is also possible to use import qualified Foo as Bar
, which imports from Foo
but with names as if the import stems from Bar
. For instance, if you type import qualified Data.List as L
, you can use foldr'
as L.foldr'
.