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

>ghci> Map.lookup "катя" $ phoneBookToMap phoneBook

>["827–91-62","943–29-29","493–29-28"]

Превосходно!

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

>ghci> Map.fromListWith max [(2,3),(2,100),(3,29),(3,11),(4,22),(4,15)]

>fromList [(2,100),(3,29),(4,22)]

Или хотим, чтобы значения с повторяющимися ключами складывались:

>ghci> Map.fromListWith (+) [(2,3),(2,100),(3,29),(3,11),(4,22),(4,15)]

>fromList [(2,103),(3,40),(4,37)]

Ну что ж, модуль >Data.Map, да и другие модули из стандартной библиотеки языка Haskell довольно неплохи. Далее посмотрим, как написать свой собственный модуль.

Написание собственных модулей

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



Мы говорим, что модуль экспортирует функции. Это значит, что когда мы его импортируем, то можем использовать экспортируемые им функции. Модуль может определить функции для внутреннего использования, но извне модуля мы видим только те, которые он экспортирует.

Модуль Geometry

Давайте разберём процесс создания модулей на простом примере. Создадим модуль, который содержит функции для вычисления объёма и площади поверхности нескольких геометрических фигур. И начнём с создания файла Geometry.hs.

В начале модуля указывается его имя. Если мы назвали файл Geometry.hs, то имя нашего модуля должно быть >Geometry. Затем следует перечислить экспортируемые функции, после чего мы можем писать сами функции:

>module Geometry

>( sphereVolume

>, sphereArea

>, cubeVolume

>, cubeArea

>, cuboidArea

>, cuboidVolume

>) where

Как видите, мы будем вычислять площади и объёмы для сфер (>sphere), кубов (>cube) и прямоугольных параллелепипедов (>cuboid). Сфера – это круглая штука наподобие грейпфрута, куб – квадратная штука, похожая на кубик Рубика, а прямоугольный параллелепипед – точь-в-точь пачка сигарет. (Дети, курить вредно!)

Продолжим и определим наши функции:

>module Geometry

>( sphereVolume , sphereArea

>, cubeVolume

>, cubeArea

>, cuboidArea

>, cuboidVolume

>) where


>sphereVolume :: Float –> Float

>sphereVolume radius = (4.0 / 3.0) * pi * (radius 3)


>sphereArea :: Float –> Float

>sphereArea radius = 4 * pi * (radius 2)


>cubeVolume :: Float –> Float

>cubeVolume side = cuboidVolume side side side