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