русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Модули

В Haskell’е модули несут двоякое назначение — с одной стороны модули необходимы для контроля над пространством имён (как, собственно, и во всех других языках прог­рам­ми­рования), с другой стороны при помощи модулей можно создавать абстрактные типы дан­ных.

Определение модуля в Haskell’е достаточно просто. Именем модуля может быть любой сим­вол, начинается имя только с заглавной буквы. Дополнительно имя модуля никак не свя­зано с файловой системой (как, например, в Pascal’е и в Java), т.е. имя файла, со­дер­жа­ще­го модуль, может быть не таким же, как и название модуля. На самом деле, в одном фай­ле может быть несколько модулей, т.к. модуль — это всего лишь декларация са­мого высокого уровня.

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

Определение модуля должно начинаться со служебного слова module. Например, ниже приведено определение модуля Tree:

module Tree (Tree (Leaf, Branch), fringe) where

data Tree a = Leaf a

| Branch (Tree a) (Tree a)

fringe :: Tree a -> [a]

fringe (Leaf x) = [x]

fringe (Branch left right) = fringe left ++ fringe right

В этом модуле описан один тип (Tree — ничего страшного, что имя типа совпадает с наз­ванием модуля, в данном случае они находятся в различных пространствах имён) и од­на функция (fringe). В данном случае модуль Tree явно экспортирует тип Tree (вместе со сво­ими подтипами Leaf и Branch) и функцию fringe — для этого имена типа и функции ука­заны в скобках после имени модуля. Если наименование какого-либо объекта не ука­зы­вать в скобках, то он не будет экспортироваться, т.е. этот объект не будет виден извне те­кущего модуля.

Для корректного отображения нового типа данных необходимо определить для него функцию Show. Наиболее простой способ:

data Tree a = Leaf a

| Branch (Tree a) (Tree a) deriving Show

Использование модуля в другом модуле выглядит еще проще:

module Main where

import Tree (Tree(Leaf, Branch), fringe)

main = print (fringe (Branch (Leaf 1) (Leaf 2)))

В приведенном примере видно, что модуль Main импортирует модуль Tree, причём в дек­ларации import явно описано, какие именно объекты импортируются из модуля Tree. Ес­ли это описание опустить, то импортироваться будут все объекты, которые модуль экс­пор­тирует, т.е. в данном случае можно было просто написать: import Tree.

Бывает так, что один модуль импортирует несколько других (надо заметить, что это обыч­ная ситуация), но при этом в импортируемых модулях существуют объекты с одним и тем же именем. Естественно, что в этом случае возникает конфликт имён. Чтобы этого из­бежать в Haskell’е существует специальное служебное слово qualified, при помощи ко­то­рого определяются те импортируемые модули, имена объектов в которых приобретают вид: <Имя Модуля>.<Имя Объекта>, т.е. для того, чтобы обратиться к объекту из ква­ли­фи­цированного модуля, перед его именем необходимо написать имя модуля:

module Main where

import qualified Tree

main = print (Tree.fringe (Tree.Leaf ’a’))

Использование такого синтаксиса полностью лежит на совести программиста. Не­ко­то­рым нравится полная определённость, которую привносят квалифицированные имена, и они используют их в ущерб размеру программ. Другим нравится использовать короткие мне­монические имена, и они используют квалификаторы (имена модулей) только по не­об­хо­димости.

Просмотров: 497


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.