52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 255

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 255

:: a мы ничего не можем сказать о содержании значения val, то по типу val :: Maybe a, мы знаем один

уровень конструкторов. Например мы уже можем проводить сопоставление с образцом.

Теперь давайте вернёмся к теории категорий и дадим формальное определение понятия. Пусть 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 Естественное преобразование

В программировании часто приходится переводить данные из одной структуры в другую. Каждая из

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

содержимое из одного ящика в другой. Например в нашем ящике только один отсек, но вдруг нам пришло