Deje que sea un CCC . Vamos a sea un producto en bifuntor . Como Cat es CCC, podemos curry :
La categoría de functor tiene una estructura monoidal habitual. A monoid en es una mónada en . Consideramos productos finitos como la estructura de monoidal .
Por lo tanto conserva la estructura monoidal, por lo que transporta un monoide a una mónada y un comonoide a una comonad. A saber, transporta un monoide arbitrario a mónada (mira la definición - debe ser un monoide). Del mismo modo, transporta el comonoide diagonal al comandante Coreader.( W r i t e r w ) w
Ahora, para concretar, despliego la construcción de Writer.
Empezar. En realidad, , simplemente tienen nombres distintos en Haskell. Tenemos un monoid Haskell :
Writer es un functor, por lo que debe mapear también los morfismos, como y . Escribo esto como a continuación, aunque no es válido en Haskell:
es una transformación natural, un morfismo en C ⇒ C . Por propiedades de c u r r y ( × ) es una función, que toma a ∈ O b ( C ) y da un morfismo en C :
De manera informal, sumas componentes de tipo w y bombas un intacta. Esta es exactamente la definición de escritor en Haskell. Uno de los obstáculos es que para la mónada ⟨ W r i t e r w , μ , eta ⟩ necesitamos
es decir, incompatibilidad de tipos. Pero estos functores son isomórficos: por el asociador habitual para productos finitos que es un isomorfismo natural ≅ λ a . w × ( w × a ) = W r i t e r w ∘ W r i t e r w. Luego definimos vía W r i t e r m a p p e n d . Omito una construcción de η a través de m e m p t y .
Escritor, siendo un funtor, conserva diagrama conmutativo, es decir, conservas monoid igualdades, por lo que tenemos para igualdades probadas concedidas para = a monoid en ( C ⇒ C ) = a mónada en C . Final.
¿Qué pasa con Reader y Cowriter? Reader es adjunto a Coreader, como se explica en la definición de Coreader, ver enlace arriba. Del mismo modo, Cowriter es adjunto al escritor. No encontré una definición de Cowriter, así que la inventé por analogía en la tabla:
{- 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')))
A continuación se encuentran las definiciones simplificadas de esas (co) mónadas. fr_ob F denota un mapeo de un functor F en objetos, fr_mor F denota un mapeo de un functor F en morfismos. Hay un objeto monoid en C .
- Escritor
- Lector
- Coreader
- Cowriter
La pregunta es que el adjunto en relaciona a los functores, no a las mónadas. No veo cómo el adjunto implica "Coreader es una comonad" → "Reader es una mónada" y "Writer es una mónada" → "Cowriter es una comonad".
Observación. Estoy luchando por proporcionar más contexto. Requiere algo de trabajo. Especialmente, si necesita pureza categórica y esas (co) mónadas fueron introducidas para programadores. Sigue regañando! ;)