Нехай - CCC . Нехай буде біфунктор продукт на . Оскільки Кіт є CCC, ми можемо каррі :
Функціональна категорія має звичну моноїдну структуру. Моноїд в є монадой в . Розглядаються кінцеві продукти , як моноідальние структури на .
Тому зберігає моноїдну структуру, тому він транспортує моноїд до монади, а комоноїд - до комонади. А саме, він транспортує довільну моноїду до монади (подивіться на визначення - повинен бути моноїдом). Аналогічно він транспортує діагональний комоноїд до комонади Кореадера.
Тепер, для конкретності, я розгортаю конструкцію Writer.
Почніть. Насправді , вони просто мають чіткі імена в Haskell. Ми маємо Haskell моноїд ⟨ ш , м а р р е н д , м е т р т у ⟩ :
Writer is a functor, so it must map also morphisms, such as and . I write this as below, though it is invalid in Haskell:
is a natural transformation, a morphism in . By properties of it is a function, which takes and gives a morphism in :
Неформально, сум компоненти типу ш і насоси недоторканими. Це саме визначення Writer в Haskell. Одним з перешкод є те , що для монади ⟨ W г я т е р ш , ц , п ⟩ Нам потрібно
i.e. incompatibility of types. But these functors are isomorphic: by the usual associator for finite products which is a natural isomorphism . Then we define via . I omit a construction of via .
Writer, being a functor, preserves commutative diagrams, i.e. preserves monoid equalities, so we have for granted proved equalities for = a monoid in = a monad in . End.
What about Reader and Cowriter? Reader is adjoint to Coreader, as explained in the definition of Coreader, see link above. Similarly, Cowriter is adjoint to Writer. I did not find a definition of Cowriter, so I made it up by analogy shown in the table:
{- 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')))
Below are the simplified definitions of those (co)monads. fr_ob F denotes a mapping of a functor F on objects, fr_mor F denotes a mapping of a functor F on morphisms. There is a monoid object in .
- Writer
- Reader
- Coreader
- Cowriter
The question is that the adjunction in relates functors, not monads. I do not see how the adjunction implies "Coreader is a comonad" "Reader is a monad" and "Writer is a monad" "Cowriter is a comonad".
Remark. I am struggling to provide more context. It requires some work. Especially, if you require categorical purity and those (co)monads were introduced for programmers. Keep nagging! ;)