Пусть будет 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 - это комонада».
Замечание. Я изо всех сил стараюсь предоставить больше контекста. Это требует некоторой работы. Особенно, если вам требуется категоричная чистота и эти (со) монады были введены для программистов. Продолжай ныть! ;)
Ответы:
Да, если монада имеет присоединенный справа N , то N автоматически наследует структуру comonad.M:C→C N N
Общая теоретико-категоричная установка для понимания этого заключается в следующем. Пусть и D две категории. Напишите F u n ( C , D ) для категории функторов из C в D ; Его объекты - функторы, а его морфизмы - естественные преобразования. Напишите F u n L ( C , D ) для полной подкатегории F u n ( C , D )C D Fun(C,D) C D FunL(C,D) Fun(C,D) на функторах, которые имеют правые примыкания (другими словами, мы рассматриваем функторы с правыми примыканиями и произвольными естественными преобразованиями между ними). Написать F R : D → C для правого сопряженного функтора F : C → D . Тогда - R : F u n L ( C , D ) → F u n ( D , C ) является контравариантным функтором: если α : F →C→D FR:D→C F:C→D -р: F u nL(C, D ) → F u n ( D,C) представляет собой естественное преобразованието есть индуцированное естественное преобразование α R : G R → F R .α : F→ G αр: Gр→ Fр
Если , то F u n ( C , C ) имеет моноидальную структуру, заданную композицией, и F u n L ( C , D ) , потому что композиция левых примыканий является присоединенной слева. В частности, ( F G ) R = G R F R , поэтому - R - антимоноидальный контравариантный функтор. Если применить - R к структурным естественным преобразованиям, которые оснащают функтором MС= D F u n (C, C) F у пL( C, Г ) (FG)R=GRFR −R −R M со структурой монады, то, что вы получаете, является comonad.
источник
Кстати, это:
немного неверно. С одной стороны , обычная терминология была бы (если я не ошибаюсь) , что является бифунктор более или C . «В» обычно означает конструкции, использующие стрелки и объекты категории, в то время как функторы «в» категориях относятся к конструкциям, связанным с несколькими категориями. И бифунктор продукта не является конструкцией в декартовой категории.× C
И это относится к большей неточности: способность каррировать бифунктор продукта не имеет ничего общего с тем, что является декартовой замкнутой. Скорее, это возможно, потому что C a t , категория категорий (вставка предостережения) является декартовой замкнутой. Таким образом, рассматриваемое карри определяется:C Cat
где является продуктом категории, и Е D является категория функторов F : D → E . Это работает независимо от того , являются ли C , D и E декартовыми замкнутыми. Когда мы позволяем C = D = E , мы получаем:C×D ED F:D→E C D E C=D=E
c u r r y × : C → C C
Но это всего лишь частный случай:
c u r r y F : C → E D
источник
Рассмотрим примыкание . Для каждого такого примыкания мы имеем монаду ⟨ G F , η , G & epsi F ⟩ , а также комонада ⟨ F G , ε , F П G ⟩ . Следует отметить, что F и G не должен быть endofunctors, и в целом они не являются (например, список монады является adjuction между свободными и забывчивыми функторами между S е т и М O п⟨F,G,ϵ,η⟩ ⟨GF,η,GϵF⟩ ⟨FG,ϵ,FηG⟩ F G Set Mon ).
Итак, что вы хотите сделать, это взять Reader (или Writer) и разложить его на сопряженные функторы, которые дают начало монаде и соответствующей ей. То есть соединение между Reader и Coreader (или Writer и Cowriter) не является тем, которое вы ищете.
И это, вероятно , лучше думать о выделки , как , т.е. ∀ X , Y . { f : X × A → Y } ≅ { f ∗ : X → Y A } . Или, если это поможет, - ∗ : hom ( - × A ,−∗:hom(−×A,=)≅hom(−,=A) ∀X,Y. {f:X×A→Y}≅{f∗:X→YA} −∗:hom(−×A,=×1)≅hom(−1,=A)
источник