Что означает "квалифицированный" в "импортном квалифицированном представлении Data.List"?

import Data.List - Я это понимаю.

Но что означает qualified в выражении import qualified Data.List?

3 ответа

Квалифицированный импорт делает импортированные объекты доступными только в квалифицированной форме, например

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.


Если вы выполняете неквалифицированный импорт (по умолчанию), вы можете ссылаться на все импортированные только по его имени.

Если вы выполняете квалифицированный импорт, вы должны префикс имени с помощью модуля, из которого он был импортирован.

например.

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, который короче.


Ключевое слово qualified означает, что символы в импортированных модулях не импортируются в неквалифицированное (префиксное) пространство имен. Они доступны только с полным именем. Например, foldr' имеет неквалифицированное имя foldr' и квалифицированное имя Data.List.foldr'.

Для предотвращения загрязнения пространства имен используется специальный импорт. Также возможно использовать import qualified Foo as Bar, который импортирует из Foo, но с именами, как если бы импорт происходил из Bar. Например, если вы наберете import qualified Data.List as L, вы можете использовать foldr' как L.foldr'.

licensed under cc by-sa 3.0 with attribution.