Стандартная библиотека языка Haskell разбита на модули, каждый из которых содержит взаимосвязанные функции и типы, служащие некоторой общей цели. Есть модуль для работы со списками, модуль для параллельного программирования, модуль для работы с комплексными числами и т. д. Все функции, типы и классы типов, с которыми мы имели дело до сих пор, были частью стандартного модуля >Prelude
– он импортируется по умолчанию. В этой главе мы познакомимся с несколькими полезными модулями и их функциями. Но для начала посмотрим, как импортировать модули.
Синтаксис для импорта модулей в программах на языке Haskell – >import ModuleName
. Импортировать модули надо прежде, чем вы приступите к определению функций, поэтому обычно импорт делается в начале файла. Конечно же, одна программа может импортировать несколько модулей. Для этого вынесите каждый оператор >import
в отдельную строку.
Давайте импортируем модуль >Data.List
, который содержит массу функций для работы со списками, и используем экспортируемую им функцию для того, чтобы написать свою – вычисляющую, сколько уникальных элементов содержит список.
>import Data.List
>numUniques :: (Eq a) => [a] –> Int
>numUniques = length . nub
Когда выполняется инструкция >import Data.List
, все функции, экспортируемые модулем >Data.List
, становятся доступными в глобальном пространстве имён. Это означает, что вы можете вызывать их из любого места программы. Функция >nub
определена в модуле >Data.List
; она принимает список и возвращает список, из которого удалены дубликаты элементов исходного списка. Композиция функций >length
и >nub
создаёт функцию, которая эквивалентна >\xs –> length (nub xs)
.
ПРИМЕЧАНИЕ. Чтобы найти нужные функции и уточнить, где они определены, воспользуйтесь сервисом Hoogle, который доступен по адресу http://www.haskell.org/hoogle/. Это поистине удивительный поисковый механизм для языка Haskell, который позволяет вести поиск по имени функции, по имени модуля и даже по сигнатуре.
В интерпретаторе GHCi вы также можете подключить функции из модулей к глобальному пространству имён. Если вы работаете в GHCi и хотите вызывать функции, экспортируемые модулем >Data.List
, напишите следующее:
>ghci> :m + Data.List
Если требуется подгрузить программные сущности из нескольких модулей, не надо вызывать команду >:m +
несколько раз, так как можно загрузить ряд модулей одновременно:
>ghci> :m + Data.List Data.Map Data.Set
Кроме того, если вы загрузили скрипт, который импортирует модули, то не нужно использовать команду >:m +
, чтобы получить к ним доступ.