Soit un CCC . Soit être un bifoncteur produit sur . Comme Cat est CCC, nous pouvons curry :
Catégorie de foncteurs a une structure monoïdale habituelle. A monoid en est une monade en . Nous considérons que les produits finis que la structure monoïdale sur .
Par conséquent préserve la structure monoïdale, donc il transporte un monoïde vers une monade et un comonoïde vers une comonade. À savoir, il transporte un monoïde arbitraire w vers ( W r i t e r w ) monade (regardez la définition - w doit être un monoïde). De même, il transporte la comonoïde diagonale vers la comonade Coreader.
Maintenant, pour être concret, je déplie la construction de Writer.
Commencer. En fait , ils ont simplement des noms distincts dans Haskell. Nous avons une monoid Haskell ⟨ w , m a p p e n d , m e m p t y ⟩ :
Writer est un foncteur, il doit donc cartographier également les morphismes, tels que et m e m p t y . J'écris ceci comme ci-dessous, bien qu'il ne soit pas valide dans Haskell:
est une transformation naturelle, un morphisme en C ⇒ C . Par propriétés de c u c'est une fonction, qui prend a ∈ O b ( C ) et donne un morphisme en C :
De façon informelle, des composants de leur montant de type p et pompes intacte. C'est exactement la définition de Writer dans Haskell. Un obstacle est que pour la monade ⟨ W r i t e r w , μ , r | ⟩ nous avons besoin
c'est-à-dire incompatibilité des types. Mais ces foncteurs sont isomorphes: par l'associateur habituel pour les produits finis qui est un isomorphisme naturel ≅ λ a . w × ( w × a ) = W r i t e r w ∘ W r i t e r w . On définit alors via W r i t e r m a . J'omets une construction de η via m e m p t y .
Écrivain, être un foncteur, conserve des diagrammes commutatives, à savoir les conserves monoid égalités, nous avons donc des égalités prouvé accordées pour = monoid dans ( C ⇒ C ) = une monade en C . Fin.
Et Reader et Cowriter? Le lecteur est adjoint à Coreader, comme expliqué dans la définition de Coreader, voir le lien ci-dessus. De même, Cowriter est adjoint à Writer. Je n'ai pas trouvé de définition de Cowriter, je l'ai donc inventée par analogie dans le tableau:
{- 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')))
Voici les définitions simplifiées de ces (co) monades. fr_ob F désigne une cartographie d'un foncteur F sur des objets, fr_mor F désigne une cartographie d'un foncteur F sur des morphismes. Il est un objet de monoid en C .
- Écrivain
- Lecteur
- Coreader
- Cowriter
La question est que l'adjonction en concerne les foncteurs, pas les monades. Je ne vois pas comment l'adjonction implique "Coreader est une comonade" → "Reader est une monade" et "Writer est une monade" → "Cowriter est une comonade".
Remarque. J'ai du mal à fournir plus de contexte. Cela demande du travail. Surtout, si vous avez besoin d'une pureté catégorique et que ces (co) monades ont été introduites pour les programmeurs. Continuez à harceler! ;)