Sia un CCC . Let un bifunctor prodotto su . Dato che Cat è CCC, possiamo curry :
La categoria Functor ha la consueta struttura monoidale. Un monoide in è una monade in . Consideriamo prodotti finiti come struttura monoidale su .
Pertanto conserva la struttura monoidale, quindi trasporta un monoide in una monade e un comonoide in una comonade. Vale a dire, trasporta un monoide arbitrario in monade (guarda la definizione - deve essere un monoide). Allo stesso modo trasporta il comonoide diagonale al comonad di Coreader.
Ora, per concretezza, ho spiegato la costruzione di Writer.
Inizio. In realtà , hanno semplicemente nomi distinti in Haskell. Abbiamo un monoide Haskell :
Writer è un funzione, quindi deve mappare anche i morfismi, come e . Scrivo questo come di seguito, sebbene non sia valido in Haskell:m e m p t y
è una trasformazione naturale, un morfismo in . Per proprietà del è una funzione, che prende e dà un morfismo in :c u r r y ( × ) a ∈ O b ( C ) C
Informalmente, somme componenti di tipo e pompe intatto. Questa è esattamente la definizione di Writer in Haskell. Un ostacolo è che per la monade abbiamo bisognow un ⟨ W r i t e r w , μ , η ⟩
cioè incompatibilità dei tipi. Ma questi funzioni sono isomorfi: dal solito associatore per prodotti finiti che è un isomorfismo naturale . Quindi definiamo tramite . una costruzione di via .≅ λ a . w × ( w × a ) = W r i t e r w ∘ W r i t e r w μ W r i t e r m a p p eη m e m p t y
Writer, essendo un funzione, conserva diagrammi commutativi, vale a dire preserva le uguaglianze monoide, quindi abbiamo per scontato uguaglianze comprovate per = un monoide in = una monade in . Fine.( C ⇒ C ) C
Che dire di Reader e Cowriter? Reader è aggiunto a Coreader, come spiegato nella definizione di Coreader, vedere il link sopra. Allo stesso modo, Cowriter è aggiunto a Writer. Non ho trovato una definizione di Cowriter, quindi l'ho inventata per analogia nella tabella:
{- 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')))
Di seguito sono riportate le definizioni semplificate di quelle (co) monadi. fr_ob F indica una mappatura di un funzione F su oggetti, fr_mor F indica una mappatura di un funzione F su morfismi. C'è un oggetto monoide in .C
- scrittore
- Lettore
- Coreader
- cowriter
La domanda è che l'aggiustamento in riferisce ai funzioni, non alle monadi. Non vedo come l'aggiunta implica "Coreader è una comonade" "Reader è una monade" e "Writer è una monade" "Cowriter è una comonade".
Osservazione. Sto lottando per fornire più contesto. Richiede un po 'di lavoro. Soprattutto, se hai bisogno di purezza categorica e quelle (co) monadi sono state introdotte per i programmatori. Continua a tormentarti! ;)