Не понимаю обозначения морфизмов в определении моноидов
Я пытаюсь понять что Monoid
с точки зрения теории категорий, но я немного запутался с нотацией, используемой для его описания. Вот Википедия:
В теории категорий моноид (или моноидный объект) (M, µ, η) в моноидальной категории (C, ⊗, I) является объектом M вместе с двумя морфизмами.
μ: M ⊗ M → M называется умножением,
η: I → M называется единицей
Моя путаница связана с обозначением морфизма. Почему бинарная операция ⊗
часть записи морфизма? Мое понимание морфизма заключается в том, что это своего рода функция, которая может отображаться из одного типа в другой (домен в кодомен), например M → M
, Почему операция ⊗
часть домена в определении? Второе замешательство о I
, Почему I
домен? Здесь нет I
объект в Monoid
совсем. Это просто нейтральный элемент объекта M
,
Я это понимаю Monoid
это категория с одним объектом, морфизмом идентичности и бинарной операцией, определенной для этого объекта, но запись заставляет меня думать, что я чего-то не понимаю.
Является M ⊗ M
как-то связано с декартовым произведением, так что область морфизма определяется как M x M
?
Изменить: я получил действительно полезный ответ на мой вопрос по обмену стека математики.
1 ответ
Является
M ⊗ M
В некоторой степени это связано с декартовым произведением, поэтому область морфизма определяется какM x M
?
Именно так. Более конкретно, мы получаем те моноиды, которые выражаются Monoid
класс из базы, выбирая Hask (категорию со всеми типами Haskell в качестве объектов и всеми функциями Haskell в качестве морфизмов) в качестве C, (,)
(конструктор парного типа) как ⊗, и ()
(тип блока) как я. Подписи µ и η, переведенные в Haskell, становятся:
μ :: (M, M) -> M
η :: () -> M
Карринг, и используя как () -> M
функции находятся в непосредственном соответствии с M
ценности (все они выглядят как \() -> m
для некоторых m
), мы знакомимся Monoid
методы:
mappend :: M -> M -> M
mempty :: M
Обратите внимание, что категориальное определение гораздо более общее, чем просто Monoid
, Например, мы могли бы продолжать работать в Hask, заменяя (,)
а также ()
с их двойниками, Either
а также Void
, таким образом получая:
μ :: Either A A -> A
η :: Void -> A
Каждый тип Хаскелла является моноидом именно таким образом (either id id
и η является absurd
).
Другой пример - использование C в качестве категории Haskell. Functor
s (с естественными преобразованиями между ними - которые я напишу как type f ~> g = forall a. f a -> g a
- как морфизмы), Compose
как ⊗, и Identity
как я:
-- Note the arrows here are ~>, and not ->
μ :: Compose M M ~> M
η :: Identity ~> M
Эти два обычно пишутся как:
-- "Inlining" the definitions of Compose, Identity, and ~>
join :: M (M a) -> M a
return :: a -> M a
Другими словами, Monad
является моноидом в категории Functor
s (что является специфической для Хаск версией "монада является моноидом в категории эндофункционеров"). Стоит отметить, что, как и в другом примере, это не единственный способ вывести моноиды из этой категории (см. Последний абзац этого ответа для указателей - остальная часть, на самом деле, может иметь отношение к чтению, как это обсуждает понятие моноидальной категории).