Введение
В
предыдущей статье я рассказал о понятиях категории и функтора в контексте категории
Hask, состоящей из типов данных и функций языка Haskell. Теперь я хочу рассказать о другом примере категории, построенном из уже известных нам понятий, а так же о весьма важном понятии моноида.
Обозначения
В прошлый раз я хотел обозначить морфизм/функцию буквой
f
, но она была занята для обозначения функтора/переменной типа
f
– никакой проблемы с точки зрения языка Haskell в этом нет, но при невнимательном прочтении это может вызвать путаницу, и я использовал для морфизма букву
g
. Пустяк, но всё же, я считаю, что полезно визуально разделять сущности, имеющие разную природу. Обычные типы я буду называть их обычными именами, а вот переменные типов я буду называть маленькими греческими буквами, причём простые (
∗
) – буквами из начала алфавита, а параметрические (
∗ → ∗
) – буквами из конца алфавита (
θ
не из конца, но она смотрится лучше, чем
χ
, которая слишком похожа на
X
). Итак, в терминологии категории
Hask:
- Объекты:
α, β, γ, δ ∷ ∗
- Функторы:
θ, φ, ψ, ω ∷ ∗ → ∗
- Морфизмы:
f, g, h ∷ α → β
Ввиду того, что GHC довольно давно поддерживает unicode, эти обозначения ничего не меняют в отношении синтаксиса и носят чисто косметический характер.
Ещё одно замечание, касательно терминологии: как вы уже заметили, то, что я в прошлый раз называл словом “кайнд” (kind), я теперь называю словом “сорт” – это считается общепринятым переводом.
Категория с объектом Hask
Давайте рассмотрим категорию, в которой будет только один объект – сама категория
Hask. Что же будет морфизмами в такой категории? Это должны быть какие-то отображения
Hask →
Hask, и мы уже знаем такой тип отображений – это эндофункторы категории
Hask, то есть типы сорта
∗ → ∗
, воплощения класса
Functor
. Теперь нужно продумать как устроены единичный морфизм и композиция в этой категории, так чтобы они удовлетворяли аксиомам.