Если вам необходимо всего несколько функций из модуля, вы можете выборочно импортировать только эти функции. Если бы вам были нужны только функции >nub и >sort из модуля >Data.List, импорт выглядел бы так:
>import Data.List (nub, sort)
Также вы можете осуществить импорт всех функций из модуля за исключением некоторых. Это бывает полезно, когда несколько модулей экспортируют функции с одинаковыми именами, и вы хотите избавиться от ненужных повторов. Предположим, у вас уже есть функция с именем >nub и вы хотите импортировать все функции из модуля >Data.List, кроме >nub, определённой в нём:
>import Data.List hiding (nub)
Другой способ разрешения конфликтов имён – квалифицированный импорт. Модуль >Data.Map, который содержит структуру данных для поиска значения по ключу, экспортирует несколько функций с теми же именами, что и модуль >Prelude, например >filter и >null. Если мы импортируем модуль >Data.Map и вызовем функцию >filter, язык Haskell не будет знать, какую функцию использовать. Вот как можно обойти такую ситуацию:
>import qualified Data.Map
Если после такого импорта нам понадобится функция >filter из модуля >Data.Map; мы должны вызывать её как >Data.Map.filter – просто идентификатор >filter ссылается на обычную функцию из модуля >Prelude, которую мы все знаем и любим. Но печатать строку >Data.Map перед именем каждой функции может и поднадоесть! Вот почему желательно переименовать модуль при импорте во что-нибудь более короткое:
>import qualified Data.Map as M
Теперь, чтобы сослаться на функцию из >Data.Map, мы вызываем её как >M.filter.
Как вы видите, символ >. используется для обращения к функциям, импортированным из модулей с указанием квалификатора, например: >M.filter. Мы также помним, что он используется для обозначения композиции функций. Как Haskell узнаёт, что мы имеем в виду? Если мы помещаем символ >. между квалифицированным именем модуля и функцией без пробелов – это обращение к функции из модуля; во всех остальных случаях – композиция функций.
ПРИМЕЧАНИЕ. Отличный способ узнать Haskell изнутри – просмотреть документацию к стандартной библиотеке и исследовать все стандартные модули и их функции. Также можно изучить исходные тексты всех модулей. Чтение исходных текстов некоторых модулей – отличный способ освоить язык и прочувствовать его особенности[9].
Решение задач средствами стандартных модулей
Модули стандартной библиотеки содержат массу функций, способных облегчить программирование на языке Haskell. Познакомимся с некоторыми из них, решая конкретные задачи.
Предположим, что у нас имеется строка, содержащая много слов. Мы хотим выяснить, сколько раз в этой строке встречается каждое слово. Первой функцией, которую мы применим, будет функция