Не понимаю обозначения морфизмов в определении моноидов - PullRequest
10 голосов
/ 18 мая 2019

Я пытаюсь понять, что такое Monoid с точки зрения теории категорий, но меня немного смущает нотация, используемая для ее описания.Вот Википедия:

В теории категорий моноид (или моноидный объект) (M, µ, η) в моноидальной категории (C, ⊗, I) является объектом M вместе с двумя морфизмами.

μ: M ⊗ M → M называется умножением,

η: I → M называется единицей

Моя путаница связана с обозначением морфизма.Почему бинарная операция является частью записи морфизма?Мое понимание морфизма заключается в том, что это своего рода функция, которая может отображаться из одного типа в другой (домен в кодомен), например M → M.Почему операция является частью домена в определении?Второе замешательство касается I.Почему I домен?В Monoid вообще нет объекта I.Это просто нейтральный элемент объекта M.

Я понимаю, что Monoid - это категория с одним объектом, морфизмом идентичности и двоичной операцией, определенной для этого объекта, но запись заставляет меня задуматьсячто я чего-то не понимаю.

M ⊗ M так или иначе связано с декартовым произведением, так что область морфизма определяется как M x M?

Редактировать: Я получил действительно полезный ответ на мой вопрос на Математическом стеке .

1 Ответ

19 голосов
/ 18 мая 2019

Является ли M ⊗ M как-то связанным с декартовым произведением, поэтому домен морфизма определяется как M x M?

Точно. Более конкретно, мы получаем те моноиды, которые выражаются классом Monoid из base , выбирая Hask (категория со всеми типами Haskell как объектами и всеми функциями Haskell как морфизмы) как C , (,) (конструктор парного типа) как и () (тип единицы) как I . Подписи μ и η , переведенные на 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

Каждый тип Haskell является моноидом именно таким образом ( μ равен either id id, а η равен absurd ).


Другой пример - C как категория Haskell Functor s (с естественными преобразованиями между ними - которые я напишу как type f ~> g = forall a. f a -> g a - как морфизмы), Compose как и Identity как I :

-- 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 с (что является специфичной для Hask версией "монады, являющейся моноидом в категории эндофункционеров") , Стоит отметить, что, как и в другом примере, это не единственный способ вывести моноиды из этой категории (см. Последний абзац этот ответ для указателей - остальная часть, на самом деле , может быть уместным чтением, так как здесь обсуждается понятие моноидальной категории).

...