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! ;)
Respuestas:
Yes, if a monadM:C→C has a right adjoint N , then N automatically inherits a comonad structure.
The general category-theoretic setting to understand this is as follows. LetC and D be two categories. Write Fun(C,D) for the categeory of functors from C to D ; Its objects are functors and its morphisms natural transformations. Write FunL(C,D) for the full subcategory of Fun(C,D) on the functors which have right adjoints (in other words, we consider functors C→D with right adjoints and arbitrary natural transformations between them). Write FR:D→C for the right adjoint of a functor F:C→D . Then −R:FunL(C,D)→Fun(D,C) is a contravariant functor: if α:F→G is a natural transformation then there is an induced natural transformation αR:GR→FR .
fuente
By the way, this:
is slightly incorrect. For one, the usual terminology would be (if I'm not mistaken) that× is a bifunctor over or on C . "In" typically means constructions using the arrows and objects of a category, whereas functors "on" categories refer to constructions relating multiple categories. And the product bifunctor isn't a construction within a Cartesian category.
And this relates to the larger inaccuracy: the ability to curry the product bifunctor has nothing to do withC being Cartesian closed. Rather, it is possible because Cat , the category of categories (insert caveats) is Cartesian closed. So the currying in question is given by:
whereC×D is a product of categories, and ED is the category of functors F:D→E . This works regardless of whether C , D and E are Cartesian closed, though. When we let C=D=E , we get:
But this is merely a special case of:
fuente
Consider the adjunction⟨F,G,ϵ,η⟩ . For every such adjunction we have a monad ⟨GF,η,GϵF⟩ and also a comonad ⟨FG,ϵ,FηG⟩ . Notably, F and G need not be endofunctors, and in general they aren't (e.g., the list monad is an adjuction between the free and forgetful functors between Set and Mon ).
So, what you want to do is take Reader (or Writer) and decompose it into the adjoint functors which give rise to the monad and the corresponding comonad. Which is to say that the connection between Reader and Coreader (or Writer and Cowriter) isn't the one you're looking for.
And it's probably better to think of currying as−∗:hom(−×A,=)≅hom(−,=A) , i.e. ∀X,Y. {f:X×A→Y}≅{f∗:X→YA} . Or if it helps, −∗:hom(−×A,=×1)≅hom(−1,=A)
fuente