•
•
Преобразование
классе Monad другие методы. Перепишем эти свойства в виде функций Haskell:
join . fmap return
= id
join . fmap join
= join . join
Порядок следования аргументов изменился, потому что мы пользуемся обычной композицией (через
точку). Выражение
стрелок, которые параметризованы объектами категории. На языке Haskell это означает применить fmap к
полиморфной функции (функции с параметром).
Также эти свойства можно изобразить графически:
Категория Клейсли
Если у нас есть монада
горию специальных стрелок вида
• Объекты категории Клейсли
232 | Глава 15: Теория категорий
• Стрелки в
• Композиция стрелок
монады
Значок ;
композиция в исходной категории
• Тождественная стрелка – это естественное преобразование
Можно показать, что категория Клейсли действительно является категорией и свойства операций компо-
зиции и тождества выполнены.
15.5 Дуальность
Интересно, что если в категории
нарисовать граф со стрелками, и затем мысленно переверните направление всех стрелок. Все пути исход-
ного графа перейдут в перевёрнутые пути нового графа. При этом пути будут проходить через те же точки.
Сохранятся композиции стрелок, только все они будут перевёрнуты. Такую категорию обозначают
оказывается, что переворачивать мы можем не только категории но и свойства категорий, или утверждения
о категориях, эту операцию называют
=
если
=
если
=
=
Есть такое свойство, если и в исходной категории
нутой категории
понятий получают другие дуализацией. При этом мы можем не проверять свойства для нового понятия,
они будут выполняться автоматически. К дуальным понятиям обычно добавляют приставку “ко”. Приведём
пример, получим понятие комонады.
Для начала вспомним определение монады. Монада – это эндофунктор (функтор, у которого совпадают
начало и конец или домен и кодомен)
•
•
Дуализируем это определение. Комонада – это эндофунктор
вания
•
•
Мы просто переворачиваем домены и кодомены в стрелках и меняем порядок в композиции. Проверьте
сошлись ли типы. Попробуйте нарисовать графическую схему свойств комонады и сравните со схемой для
монады.
Можно также определить и категорию коКлейсли. В категории коКлейсли все стрелки имеют вид
Теперь получим композицию в категории коКлейсли:
Мы перевернули цепочки композиций слева и справа от знака равно. Проверьте сошлись ли типы. Не
забывайте что в этом определении
рять является ли категория коКлейсли действительно категорией. Нам не нужно опять проверять свойства
Дуальность | 233
стрелки тождества и ассоциативности композиции, если мы уже проверили их для монады. Следовательно
перевёрнутое утверждение будет выполняться в перевёрнутой категории коКлейсли. В этом основное пре-
имущество определения через дуализацию.
Этим приёмом мы можем воспользоваться и в Haskell, дуализируем класс Monad:
class Monad m where
return
:: a -> m a
(>>=)
:: m a -> (a -> m b) -> m b
Перевернём все стрелки:
class Comonad c where
coreturn
:: c a -> a
cobind
:: c b -> (c b -> a) -> c a
15.6 Начальный и конечный объекты
Начальный объект
Представим, что в нашей категории есть такой объект 0, который соединён со всеми объектами. При-
чём стрелка начинается из этого объекта и для каждого объекта может быть только одна стрелка которая
соединят данный объект с 0. Графически эту ситуацию можно изобразить так: