haskell-notes

Если у нас есть монада T , определённая в категории A, то мы можем построить в этой категории кате-

горию специальных стрелок вида A > T B. Эту категорию называют категорией Клейсли.

• Объекты категории Клейсли AT – это объекты исходной категории A.

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

• Стрелки в AT это стрелки из A вида A > T B, мы будем обозначать их A >T B

• Композиция стрелок f : A >T B и g : B >T C определена с помощью естественных преобразований

монады T :

f ; T g = f ; T g ; µ

Значок ; T указывает на то, что слева от равно композиция в AT . Справа от знака равно используется

композиция в исходной категории A.

• Тождественная стрелка – это естественное преобразование ?.

Можно показать, что категория Клейсли действительно является категорией и свойства операций компо-

зиции и тождества выполнены.

15.5 Дуальность

Интересно, что если в категории A перевернуть все стрелки, то снова получится категория. Попробуйте

нарисовать граф со стрелками, и затем мысленно переверните направление всех стрелок. Все пути исход-

ного графа перейдут в перевёрнутые пути нового графа. При этом пути будут проходить через те же точки.

Сохранятся композиции стрелок, только все они будут перевёрнуты. Такую категорию обозначают Aop. Но

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

о категориях, эту операцию называют дуализацией. Определим её:

dual A

=

A

если A является объектом

dual x

=

x

если x обозначает стрелку

dual ( f : A > B) = dual f : B > A

A и B поменялись местами

dual ( f ; g)

=

dual g ; dual f

f и g поменялись местами

dual ( idA)

=

idA

Есть такое свойство, если и в исходной категории A выполняется какое-то утверждение, то в перевёр-

нутой категории Aop выполняется перевёрнутое (дуальное) свойство. Часто в теории категорий из одних

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

они будут выполняться автоматически. К дуальным понятиям обычно добавляют приставку “ко”. Приведём

пример, получим понятие комонады.

Для начала вспомним определение монады. Монада – это эндофунктор (функтор, у которого совпадают

начало и конец или домен и кодомен) 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)

Эти свойства следуют из определения начального объекта. Свойство тождества говорит о том, что стрелка

ведущая из начального объекта в начальный является тождественной стрелкой. В самом деле по определе-

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162