понятий получают другие дуализацией. При этом мы можем не проверять свойства для нового понятия,
они будут выполняться автоматически. К дуальным понятиям обычно добавляют приставку “ко”. Приведём
пример, получим понятие комонады.
Для начала вспомним определение монады. Монада – это эндофунктор (функтор, у которого совпадают
начало и конец или домен и кодомен) T : A → A и два естественных преобразования η : I → T и
µ : T T → T , такие что выполняются свойства:
• T η ; µ = id
• T µ ; µ = µ ; µ
Дуализируем это определение. Комонада – это эндофунктор T : A → A и два естественных преобразо-
вания η : T → I и µ : T T → T , такие что выполняются свойства
• µ ; T η = id
• µ ; T µ = µ ; µ
Мы просто переворачиваем домены и кодомены в стрелках и меняем порядок в композиции. Проверьте
сошлись ли типы. Попробуйте нарисовать графическую схему свойств комонады и сравните со схемой для
монады.
Можно также определить и категорию коКлейсли. В категории коКлейсли все стрелки имеют вид T A →
B. Теперь дуализируем композицию из категории Клейсли:
f ; T g = f ; T g ; µ
Теперь получим композицию в категории коКлейсли:
g ; T f = µ ; T g ; f
Мы перевернули цепочки композиций слева и справа от знака равно. Проверьте сошлись ли типы. Не
забывайте что в этом определении η и µ естественные преобразования для комонады. Нам не нужно прове-
рять является ли категория коКлейсли действительно категорией. Нам не нужно опять проверять свойства
Дуальность | 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. Графически эту ситуацию можно изобразить так:
. . .
A 1
A 2
. . .
0
A 3
. . .
. . .
A 4
Такой объект называют начальным (initial object). Его принято обозначать нулём, словно это начало от-
счёта. Для любого объекта A из категории A с начальным объектом 0 существует и только одна стрел-
ка f : 0 → B. Можно сказать, что начальный объект определяет функцию, которая переводит объекты A в
стрелки f : 0 → A. Эту функцию обозначают специальными скобками ( | · |), она называется катаморфизмом
(catamorphism).
( | A |) = f : 0 → A
У начального объекта есть несколько важных свойств. Они очень часто встречаются в разных вариациях,
в понятиях, которые определяются через понятие начального объекта:
( | 0 |) = id 0
тождество
f, g : 0 → A ⇒ f = g
уникальность
f : A → B
⇒ ( | A |) ; f = ( | B |)
слияние (fusion)
Эти свойства следуют из определения начального объекта. Свойство тождества говорит о том, что стрелка
ведущая из начального объекта в начальный является тождественной стрелкой. В самом деле по определе-
нию начального объекта для каждого объекта может быть только одна стрелка, которая начинается в 0 и