Если вам необходимо всего несколько функций из модуля, вы можете выборочно импортировать только эти функции. Если бы вам были нужны только функции >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. Познакомимся с некоторыми из них, решая конкретные задачи.
Предположим, что у нас имеется строка, содержащая много слов. Мы хотим выяснить, сколько раз в этой строке встречается каждое слово. Первой функцией, которую мы применим, будет функция