Читаем Учебник по Haskell полностью

= Just a

В этой функции мы перекладываем элементы из списка [a] в частично определённое значение Maybe.

Тоже самое происходит и в функции concat:

230 | Глава 15: Теория категорий

concat :: [[a]] -> [a]

Элементы перекладываются из списка списков в один список. В теории категорий этот процесс называ-

ется естественным преобразованием. Структуры определяются функторами. Поэтому в определении будет

участвовать два функтора. В функции onlyOne это были функторы [] и Maybe. При перекладывании элемен-

тов мы можем просто выбросить все элементы:

burnThemALl :: [a] -> ()

burnThemAll = const ()

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

любой тип в единственное значение (), а функцию в id:

data Empty a = Empty

instance Functor Empty where

fmap = const id

Тогда тип функции burnThemAll будет параметризован и слева и справа от стрелки:

burnThemAll :: [a] -> Empty a

burnThemAll = const Empty

Пусть даны две категории A и B и два функтора F, G : A → B. Преобразованием (transformation) в B из

F в G называют семейство стрелок ε:

εA : F A →B GA

для любого A из A

Рассмотрим преобразование onlyOne :: [a] -> Maybe a. Категории A и B в данном случае совпадают~–

это категория Hask. Функтор F – это список, а функтор G это Maybe. Преобразование onlyOne для каждого

объекта a из Hask определяет стрелку

onlyOne :: [a] -> Maybe a

Так мы получаем семейство стрелок, параметризованное объектом из Hask:

onlyOne :: [Int] -> Maybe Int

onlyOne :: [Char] -> Maybe Char

onlyOne :: [Int -> Int] -> Maybe (Int -> Int)

...

...

Теперь давайте определим, что значит перекладывать из одной структуры в другую, не меняя содержа-

ния. Представим, что функтор – это контейнер. Мы можем менять его содержание с помощью метода fmap.

Например мы можем прибавить единицу ко всем элементам списка xs с помощью выражения fmap (+1) xs.

Точно так же мы можем прибавить единицу к частично определённому значению. С точки зрения теории ка-

тегорий суть понятия “останется неизменным при перекладывании” заключается в том, что если мы возьмём

любую функцию к примеру прибавление единицы, то нам неважно когда её применять до функции onlyOne

или после. И в том и в другом случае мы получим одинаковый ответ. Давайте убедимся в этом:

onlyOne $ fmap (+1) [1,2,3,4,5]

=>

onlyOne [2,3,4,5,6]

=>

Just 2

fmap (+1) $ onlyOne [1,2,3,4,5]

=>

fmap (+1) $ Just 1

=>

Just 2

Результаты сошлись, обратите внимание на то, что функции fmap (+1) в двух вариантах являются раз-

ными функциями. Первая работает на списках, а вторая на частично определённых значениях. Суть в том,

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

внутри функтора [] или внутри функтора Maybe. Теперь давайте выразим это на языке теории категорий.

Преобразование ε в категории B из функтора F в функтор G называют естественным (natural), если

F f ; εB = εA ; Gf

для любого f : A →A B

Естественное преобразование | 231

Это свойство можно изобразить графически:

ε

F A

A

GA

F f

Gf

F B

GB

εB

По смыслу ясно, что если у нас есть три структуры данных (или три функтора), если мы просто пере-

ложили данные из первой во вторую, а затем переложили данные из второй в третью, ничего не меняя. То

итоговое преобразование, которое составлено из последовательного применения перекладывания данных

также не меняет данные. Это говорит о том, что композиция двух естественных преобразований также явля-

ется естественным преобразованием. Также мы можем составить тождественное преобразование, для двух

одинаковых функторов F : A → B, это будет семейство тождественных стрелок в категории B. Получает-

ся, что для двух категорий A и B мы можем составить категорию F tr( A, B), в которой объектами будут

функторы из A в B, а стрелками будут естественные преобразования. Поскольку естественные преобразова-

ния являются стрелками, которые соединяют функторы, мы будем обозначать их как обычные стрелки. Так

запись η : F → G обозначает преобразование η, которое переводит функтор F в функтор G.

Интересно, что изначально создатели теории категорий Саундедерс Маклейн и Сэмюэль Эйленберг при-

думали понятие естественного преобразования, а затем, чтобы дать ему обоснование было придумано поня-

тие функтора, и наконец для того чтобы дать обоснование функторам были придуманы категории. Катего-

рии содержат объекты и стрелки, для стрелок есть операция композиции. Также для каждого объекта есть

тождественная стрелка. Функторы являются стрелками в категории, в которой объектами являются другие

категории. А естественные преобразования являются стрелками в категории, в которой объектами являются

функторы. Получается такая иерархия структур.

15.4 Монады

Монадой называют эндофунктор T : A → A, для которого определены два естественных преобразования

η : I → T и µ : T T → T и выполнены два свойства:

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных