Изучай Haskell во имя добра! (Липовача) - страница 67

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

Подсчёт слов

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