Dies ist kein typecheck, da die Klasse Adjunction
nur eine kleine Teilmenge von Zusätzen darstellt, bei denen beide Funktoren Endofunktoren auf Hask sind .
Wie sich herausstellt, ist dies bei der Adjunktion nicht der Fall (<-:) r -| (<-:) r
. Hier gibt es zwei subtil unterschiedliche Funktoren:
f = (<-:) r
, der Funktor von Hask nach Op (Hask) (die entgegengesetzte Kategorie von Hask, manchmal auch als Hask ^ op bezeichnet)
g = (<-:) r
, der Funktor von Op (Hask) nach Hask
Insbesondere counit
sollte dies eine natürliche Transformation in der Kategorie Op (Hask) sein, bei der Pfeile umgedreht werden:
unit :: a -> g (f a)
counit :: f (g a) <-: a
In der Tat counit
fällt unit
in dieser Ergänzung mit.
Um dies richtig zu erfassen, müssen wir die Klassen Functor
und verallgemeinern Adjunction
, damit wir Zusätze zwischen verschiedenen Kategorien modellieren können:
class Exofunctor c d f where
exomap :: c a b -> d (f a) (f b)
class
(Exofunctor d c f, Exofunctor c d g) =>
Adjunction
(c :: k -> k -> Type)
(d :: h -> h -> Type)
(f :: h -> k)
(g :: k -> h) where
unit :: d a (g (f a))
counit :: c (f (g a)) a
Dann bekommen wir wieder, dass Compose
es sich um eine Monade handelt (und um eine Comonade, wenn wir den Zusatz umdrehen):
newtype Compose f g a = Compose { unCompose :: f (g a) }
adjReturn :: forall c f g a. Adjunction c (->) f g => a -> Compose g f a
adjReturn = Compose . unit @_ @_ @c @(->)
adjJoin :: forall c f g a. Adjunction c (->) f g => Compose g f (Compose g f a) -> Compose g f a
adjJoin = Compose . exomap (counit @_ @_ @c @(->)) . (exomap . exomap @(->) @c) unCompose . unCompose
und Cont
ist nur ein Sonderfall davon:
type Cont r = Compose ((<-:) r) ((<-:) r)
Weitere Informationen finden Sie auch in dieser Übersicht: https://gist.github.com/Lysxia/beb6f9df9777bbf56fe5b42de04e6c64
Ich habe gelesen, dass sie mit zwei Adjunkten eine einzigartige Monade und Comonade bilden, aber mit einer Monade kann sie in mehrere Faktoren zerlegt werden. Gibt es ein Beispiel dafür?
Die Faktorisierung ist im Allgemeinen nicht eindeutig. Sobald Sie die obigen M
Zusätze verallgemeinert haben, können Sie zumindest jede Monade als Zusatz zwischen ihrer Kleisli-Kategorie und ihrer Basiskategorie (in diesem Fall Hask) faktorisieren.
Every monad M defines an adjunction
F -| G
where
F : (->) -> Kleisli M
: Type -> Type -- Types are the objects of both categories (->) and Kleisli m.
-- The left adjoint F maps each object to itself.
: (a -> b) -> (a -> M b) -- The morphism mapping uses return.
G : Kleisli M -> (->)
: Type -> Type -- The right adjoint G maps each object a to m a
: (a -> M b) -> (M a -> M b) -- This is (=<<)
Ich weiß nicht, ob die Fortsetzungsmonade einer Adjunktion zwischen Endofunktoren auf Hask entspricht.
Siehe auch den nCatLab-Artikel zu Monaden: https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity
Beziehung zu Zusätzen und Monadizität
Jede Adjunktion (L ⊣ R) induziert eine Monade R∘L und eine Comonade L∘R. Es gibt im Allgemeinen mehr als eine Adjunktion, die auf diese Weise zu einer bestimmten Monade führt. Tatsächlich gibt es eine Kategorie von Adjunktionen für eine bestimmte Monade. Das ursprüngliche Objekt in dieser Kategorie ist die Adjunktion über die Kleisli-Kategorie der Monade, und das Endobjekt ist das über der Eilenberg-Moore-Kategorie der Algebren. (zB Borceux, Bd. 2, Prop. 4.2.2) Letzteres wird als monadische Adjunktion bezeichnet.