Seja um CCC . Deixe ser um produto em bifunctor . Como Cat é CCC, podemos curry :
A categoria de funções possui estrutura monoidal usual. Um monóide em é um mônade em . Consideramos produtos finitos como a estrutura monoidal em .
Portanto preserva a estrutura monoidal, portanto transporta um monóide para uma mônada e um comonóide para uma comonada. Ou seja, ele transporta um monóide arbitrário para mônada (veja a definição - deve ser um monóide). Da mesma forma, transporta o comonóide diagonal para a comonada de Coreader.
Agora, por concretude, desdobro a construção do Writer.
Início. Na verdade , eles simplesmente têm nomes distintos em Haskell. Temos um monóide Haskell :
O Writer é um functor, portanto deve mapear também morfismos, como e . Eu escrevo isso como abaixo, embora seja inválido em Haskell:
é uma transformação natural, um morfismo em . Por propriedades do , é uma função que recebe e fornece um morfismo em :
Informalmente, o soma componentes do tipo bombeia intacto. Esta é exatamente a definição de Writer em Haskell. Um obstáculo é que, para a Mônada ⟨ W r i t e r w , μ , r | ⟩ Precisamos
ou seja, incompatibilidade de tipos. Mas esses functores são isomórficos: pelo associador usual de produtos finitos, que é um isomorfismo natural . Em seguida, definimos via . Eu omito a construção de via .
O Writer, sendo um functor, preserva diagramas comutativos, ou seja, preserva as igualidades monóides, por isso temos garantido igualdades comprovadas para = um monóide em = uma mônada em . Fim.
E o Reader e o Cowriter? O Reader é adjacente ao Coreader, conforme explicado na definição de Coreader, veja o link acima. Da mesma forma, o Cowriter é adjacente ao Writer. Como não encontrei uma definição de Cowriter, criei-a por analogia mostrada na tabela:
{- 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')))
Abaixo estão as definições simplificadas dessas (co) mônadas. fr_ob F indica um mapeamento de um functor F em objetos, fr_mor F indica um mapeamento de um functor F em morfismos. Existe um objecto monóide em .
- Escritor
- Leitor
- Coreader
- Cowriter
A questão é que a adjunção em relaciona functores, não mônadas. Não vejo como a adjunção implica "Coreader é uma comonada" "Reader é uma mônada" e "Writer é uma mônada" "Cowriter é uma comonada".
Observação. Estou lutando para fornecer mais contexto. Requer algum trabalho. Especialmente, se você precisar de pureza categórica e essas (co) mônadas foram introduzidas para programadores. Continue importunando! ;)