Пусть будет CCC . Пусть быть бифунктором продукта на . Так как Cat - это CCC, мы можем карри (\ times) :
Функторная категория имеет обычную моноидальную структуру. Моноид в является монадой . Рассматриваются конечные продукты , как моноидальные структуры на .
Поэтому сохраняет моноидальную структуру, поэтому он переносит моноид в монаду и комоноид в комонаду. А именно, он переносит произвольный моноид в монаду (посмотрите на определение - должен быть моноидом). Точно так же он переносит диагональный комоноид в комонаду Coreader.
Теперь, для конкретности, я раскрываю конструкцию Writer.
Начать. На самом деле , они просто имеют разные имена в Haskell. У нас есть моноид Haskell :
Writer функтор, поэтому необходимо сопоставить также морфизмов, такие как и . Я пишу это, как показано ниже, хотя в Haskell это недопустимо:м е т р т у
является естественным преобразованием, морфизм в . По свойствам это функция, которая принимает и дает морфизм в :c u r r y ( × ) a ∈ O b ( C ) C
Неформально суммирует компоненты типа и насосы нетронутыми. Это в точности определение Writer в Haskell. Одним из препятствий является то, что для монады нам нужнош ⟨ Ш т я т е р ш , μ , п ⟩
т.е. несовместимость типов. Но эти функторы изоморфны: обычным ассоциатором для конечных произведений, который является естественным изоморфизмом . Затем мы определяем через . Я опускаю конструкцию через .≅ λ a . ш × ( ш × ) = Ш г я т е р ш ∘ Ш т я т е р ш μ Ш т я т е р м р р еП м е т р т у
Writer, будучи функтором, сохраняет коммутативные диаграммы, т. Е. Сохраняет моноидные равенства, поэтому мы имеем само собой разумеется доказанные равенства для = моноид в = монаде в . Конец.( С ⇒ С ) С
Как насчет Reader и Cowriter? Reader присоединяется к Coreader, как описано в определении Coreader, см. Ссылку выше. Точно так же Cowriter присоединяется к Writer. Я не нашел определения Cowriter, поэтому составил его по аналогии, приведенной в таблице:
{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
duplicate (Cowriter g) = Cowriter
(\w' -> Cowriter (\w -> g (w `mappend` w')))
Ниже приведены упрощенные определения этих (со) монад. fr_ob F обозначает отображение функтора F на объекты, fr_mor F обозначает отображение функтора F на морфизмы. Существует моноид объект в .С
- писатель
- читатель
- Coreader
- Cowriter
Вопрос в том, что присоединение в относится к функторам, а не к монадам. Я не понимаю, как в присоединении подразумевается «Coreader - это комонада» «Reader - это монада», а «Writer - это монада» «Cowriter - это комонада».
Замечание. Я изо всех сил стараюсь предоставить больше контекста. Это требует некоторой работы. Особенно, если вам требуется категоричная чистота и эти (со) монады были введены для программистов. Продолжай ныть! ;)