Что означает "квалифицированный" в "импортном квалифицированном представлении 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'.