52700.fb2
уровень конструкторов. Например мы уже можем проводить сопоставление с образцом.
Теперь давайте вернёмся к теории категорий и дадим формальное определение понятия. Пусть A и B –
категории, тогда функтором из A в B называют отображение F , которое переводит объекты A в объекты B
и стрелки A в стрелки B, так что выполнены следующие свойства:
F f
:
F A →B F B если f : A →A B
F idA
=
idF A
для любого объекта A из A
F ( f ; g)
=
F f ; F g
если ( f ; g) подходят по типам
Здесь запись →A и →B означает, что эти стрелки в разных категориях. После отображения стрелки f
из категории A мы получаем стрелку в категории B, это и отражено в типе F f : F A →B F B. Первое
свойство говорит о том, что после отображения стрелки соединяют те же объекты, что и до отображения.
Второе свойства говорит о сохранении тождественных стрелок. А последнее свойство, говорит о том, что
“пути” между объектами также сохраняются. Если мы находимся в категории A в объекте A и перед нами
есть путь состоящий из нескольких стрелок в объект B, то неважно как мы пойдём в F B либо мы пройдём
этот путь в категории A и в самом конце переместимся в F B или мы сначала переместимся в F A и затем
пройдём по образу пути в категории F B. Так и так мы попадём в одно и то же место. Схематически это
можно изобразить так:
f
g
A
B
C
F
F
F
F A
F B
F C
F f
F g
Стрелки сверху находятся в категории A, а стрелки снизу находятся в категории B. Функтор F : A → A,
который переводит категорию A в себя называют эндофунктором (endofunctor). Функторы отображают одни
категории в другие сохраняя структуру первой категории. Мы словно говорим, что внутри второй категории
есть структура подобная первой. Интересно, что последовательное применение функторов, также является
функтором. Мы будем писать последовательное применение функторов F и G слитно, как F G. Также можно
определить и тождественный функтор, который ничего не делает с категорией, мы будем обозначать его как
IA или просто I, если категория на которой он определён понятна из контекста. Это говорит о том, что мы
можем построить категорию, в которой объектами будут другие категории, а стрелками будут функторы.
15.3 Естественное преобразование
В программировании часто приходится переводить данные из одной структуры в другую. Каждая из
структур хранит какие-то конкретные значения, но мы ничего с ними не делаем мы просто перекладываем
содержимое из одного ящика в другой. Например в нашем ящике только один отсек, но вдруг нам пришло