Что означает "квалифицированный" в "импортном квалифицированном представлении Data.List"?
import Data.List
- Я это понимаю.
Но что означает qualified
в выражении import qualified Data.List
?
Ответы
Ответ 1
Квалифицированный импорт делает импортированные объекты доступными только в квалифицированной форме, например
import qualified Data.List
result :: [Int]
result = Data.List.sort [3,1,2,4]
С помощью всего лишь import Data.List
объекты доступны в квалифицированной форме и в неквалифицированной форме. Обычно просто выполнение квалифицированного импорта приводит к слишком длинным именам, поэтому вы
import qualified Data.List as L
result :: [Int]
result = L.sort [3,1,2,4]
Квалифицированный импорт позволяет использовать функции с тем же именем, импортированные из нескольких модулей, например. map
из Prelude
и map
из Data.Map
.
Ответ 2
Если вы выполняете неквалифицированный импорт (по умолчанию), вы можете ссылаться на все импортированные только по его имени.
Если вы выполняете квалифицированный импорт, вы должны префикс имени с помощью модуля, из которого он был импортирован.
например.
import Data.List (sort)
Это неквалифицированный импорт. Теперь вы можете сказать либо sort
, либо Data.List.sort
.
import qualified Data.List (sort)
Это квалифицированный импорт. Теперь sort
сам по себе не работает, и вы должны сказать Data.List.sort
.
Поскольку это довольно продолжительное, обычно вы говорите что-то вроде
import qualified Data.List (sort) as LS
и теперь вы можете написать LS.sort
, который короче.
Ответ 3
Ключевое слово qualified
означает, что символы в импортированных модулях не импортируются в неквалифицированное (префиксное) пространство имен. Они доступны только с полным именем. Например, foldr'
имеет неквалифицированное имя foldr'
и квалифицированное имя Data.List.foldr'
.
Для предотвращения загрязнения пространства имен используется специальный импорт. Также возможно использовать import qualified Foo as Bar
, который импортирует из Foo
, но с именами, как если бы импорт происходил из Bar
. Например, если вы наберете import qualified Data.List as L
, вы можете использовать foldr'
как L.foldr'
.