Главная » Haskell » Система модулей

0

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

module ModuleName  where

В этом определении используются  ключевые слова module и where, между которыми заключается наименование модуля. Это наименование должно начинаться с заглавной буквы. Название модуля  необязательно должно совпадать с именем файла, в котором модуль находится, но при таком совпадении транслятор языка Haskell может самостоятельно найти требуемый модуль.

Каждый  файл с исходными кодами  на языке  Haskell может (и  должен) содержать ровно один модуль. Указанная выше строка определения модуля должна быть первой значащей строкой (не комментарием) в любом исходном файле. Однако можно опустить это определение, тогда транслятор языка Haskell будет использовать имя модуля по умолчанию — Main.

4.1.1.    Экспорт программных сущностей

Модули в языке Haskell могут самостоятельно определять, какие программные сущности, определённые в самом модуле, могут быть видимы извне. Для этого используется секция экспорта в определении модуля. В примере выше эта секция была пропущена,  что означает для транслятора языка, что такой модуль экспортирует все программные  сущности, которые в нём определены.

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

module  SomeModule  ( SomeType, someFunction

) where

В этом примере модуль SomeModule экспортирует только две  программные сущности: тип (или класс, это определить невозможно,  хотя по имени должно быть понятно, что тип) SomeType и функцию someFunction. Этот модуль может содержать внутри себя и другие определения, но они не будут видны извне модуля. Однако перечисленные программные сущности должны быть определены внутри модуля в обязательном порядке. В противном случае возникнет ошибка.

Что  интересно, конструкторы данных в типах тоже  могут быть  экспортированы по желанию разработчика программного  обеспечения. В приведённом выше примере у типа SomeType не экспортируется ни одного конструктора, поэтому этот тип может быть использован ограниченно  — извне модуля можно будет пользоваться только идентификатором SomeType. В случае, если необходимо экспортировать  определённые конструкторы этого типа, то их также необходимо

перечислить через запятую в круглых  скобках (), но уже после наименования типа:

module  SomeModule  ( SomeType

(

One, Two

),

someFunction

) where

Если необходимо экспортировать все конструкторы некоторого  типа,  то их можно не перечислять в круглых скобках, заменив двумя точками:

module  SomeModule  ( SomeType(..), someFunction

) where

Такой  подход к раздельному экспорту (и импорту) конструкторов  данных у типов позволяет создавать абстрактные типы данных, у которых скрыта функциональность по созданию объектов этого типа. Эта технология подробно описана в разделе 4.2.. Абсолютно такой  же  подход используется и для методов экспортируемых классов  — можно выборочно экспортировать только те методы классов, которые необходимы извне модуля.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии