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

Стандартная библиотека языка 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 +, чтобы получить к ним доступ.