Sei ein CCC . Lassen ein Produkt bifunctor auf sein . Da Cat CCC ist, können wir curry :
Die Funktorkategorie hat die übliche monoidale Struktur. A monoid in ist ein monadisch in . Wir betrachten endliche Produkte als monoidal Struktur auf .
Daher behält die monoidale Struktur bei und transportiert ein Monoid zu einer Monade und ein Comonoid zu einer Comonade. Es transportiert nämlich ein beliebiges Monoid zu ( W r i t e r w ) Monade (siehe Definition - w muss ein Monoid sein). Ebenso transportiert es den diagonalen Comonoid zur Coreader- Comonade.
Der Vollständigkeit halber entfalte ich jetzt die Konstruktion von Writer.
Start. Eigentlich , sie haben nur unterschiedliche Namen in Haskell. Wir haben eine Haskell monoid :
Writer ist ein Funktors, so ist es auch morphisms abbilden muss, wie beispielsweise und . Ich schreibe dies wie folgt, obwohl es in Haskell ungültig ist:
ist eine natürliche Transformation, eine morphism in . Durch die Eigenschaften von es eine Funktion, die annimmtund einen Morphismus in ergibt:
Formlos, Summen - Komponenten vom Typ W und die Pumpen eines intakt. Dies ist genau die Definition von Writer in Haskell. Ein Hindernis ist , dass für die Monade ⟨ W r i t e r w , μ , & eegr; ⟩ wir brauchen
dh Inkompatibilität von Typen. Diese Funktoren sind jedoch isomorph: durch den üblichen Assoziator für endliche Produkte, der ein natürlicher Isomorphismus ≅ λ a ist . w × ( w × a ) = W r i t e r w ∘ W r i t e r w. Anschließend definieren wir über W r i t e r m a p p e n d . Ich lasse eine Konstruktion von η über m e m p t y aus .
Writer, wobei ein Funktors bewahrt kommutative Diagramme, dh Konserven monoid Gleichheiten, so haben wir selbstverständlich bewiesen Gleichheiten für = a monoid in ( C ⇒ C ) = a monadisch in C . Ende.
Was ist mit Reader und Cowriter? Der Leser ist an Coreader gebunden, wie in der Definition von Coreader erläutert, siehe Link oben. Ebenso wird Cowriter zum Writer ernannt. Ich habe keine Definition von Cowriter gefunden, also habe ich sie mir analog aus der Tabelle ausgedacht:
{- 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')))
Nachfolgend finden Sie die vereinfachten Definitionen dieser (Co-) Monaden. fr_ob F bezeichnet eine Abbildung eines Funktors F auf Objekte, fr_mor F bezeichnet eine Abbildung eines Funktors F auf Morphismen. Es ist ein Objekt monoid in C .
- Schriftsteller
- Leser
- Coreader
- Cowriter
Die Frage ist, dass sich die Adjunktion in auf Funktoren bezieht, nicht auf Monaden. Ich verstehe nicht, wie die Adjunktion impliziert "Coreader ist eine Komonade" → "Reader ist eine Monade" und "Writer ist eine Monade" → "Cowriter ist eine Komonade".
Anmerkung. Ich habe Mühe, mehr Kontext bereitzustellen. Es erfordert etwas Arbeit. Insbesondere, wenn Sie kategorische Reinheit benötigen und diese (Co) Monaden für Programmierer eingeführt wurden. Nörgeln Sie weiter! ;)