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