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

>( volume

>, area

>) where


>import qualified Geometry.Cuboid as Cuboid


>volume :: Float –> Float

>volume side = Cuboid.volume side side side


>area :: Float –> Float

>area side = Cuboid.area side side side

Обратите внимание, что мы поместили файл Sphere.hs в папку с именем Geometry и определили имя модуля как >Geometry.Sphere. То же самое мы сделали для куба и параллелепипеда. Также отметьте, что во всех трёх модулях определены функции с одинаковыми именами. Мы вправе так поступать, потому что функции находятся в разных модулях.

Итак, если мы редактируем файл, который находится на одном уровне с папкой Geometry, то запишем:

>import Geometry.Sphere

после чего сможем вызывать функции >area и >volume, которые вычислят площадь и объём сферы. Если нам потребуется использовать несколько наших модулей, мы должны выполнить квалифицированный импорт, потому что они экспортируют функции с одинаковыми именами. Делаем так:

>import qualified Geometry.Sphere as Sphere

>import qualified Geometry.Cuboid as Cuboid

>import qualified Geometry.Cube as Cube

Затем мы сможем вызывать функции >Sphere.area, >Sphere.volume, >Cuboid.area и т. д., и каждая функция вычислит площадь или объём соответствующего объекта.

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

Позднее при написании программы со схожей функциональностью вы сможете просто импортировать свой модуль.

7

Создание новых типов и классов типов

В предыдущих главах мы изучили некоторые типы и классы типов в языке Haskell. Из этой главы вы узнаете, как создать и заставить работать свои собственные!

Введение в алгебраические типы данных


До сих пор мы сталкивались со многими типами данных – >Bool, >Int, >Char, >Maybe и др. Но как создать свой собственный тип? Один из способов – использовать ключевое слово >data. Давайте посмотрим, как в стандартной библиотеке определён тип >Bool:

>data Bool = False | True

Ключевое слово >data объявляет новый тип данных. Часть до знака равенства вводит идентификатор типа, в данном случае >Bool. Часть после знака равенства – это конструкторы данных, которые также называют конструкторами значений. Они определяют, какие значения может принимать тип. Символ >| означает «или». Объявление можно прочесть так: тип >Bool может принимать значения >True или >False. И имя типа, и конструкторы данных должны начинаться с прописной буквы.

Рассуждая подобным образом, мы можем думать, что тип >Int объявлен так:

>data Int = –2147483648 | –2147483647 | ... | –1 | 0 | 1 | 2 | ... | 2147483647