Wie kann man die Fortsetzungsmonade in linke und rechte Adjunkte zerlegen?

11

As State Monad kann in Produkt (Left - Functor) und Reader (Right - Representable) zerlegt werden.

  1. Gibt es eine Möglichkeit, die Fortsetzungsmonade zu faktorisieren? Der folgende Code ist mein Versuch, bei dem keine Überprüfung durchgeführt wird
-- To form a -> (a -> k) -> k
{-# LANGUAGE MultiParamTypeClasses, TypeOperators, InstanceSigs, TypeSynonymInstances #-}
type (<-:) o i = i -> o
-- I Dont think we can have Functor & Representable for this type synonym

class Isomorphism a b where
   from :: a -> b
   to :: b -> a

instance Adjunction ((<-:) e) ((<-:) e) where
   unit :: a -> (a -> e) -> e
   unit a handler = handler a

   counit :: (a -> e) -> e -> a
   counit f e = undefined -- If we have a constraint on Isomorphism a e then we can implement this
  1. Gibt es eine Liste von Links- und Rechtsverbindungen, die Monaden bilden?

  2. 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?

Pawan Kumar
quelle

Antworten:

11

Dies ist kein typecheck, da die Klasse Adjunctionnur 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 counitsollte 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 counitfällt unitin dieser Ergänzung mit.

Um dies richtig zu erfassen, müssen wir die Klassen Functorund 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 Composees 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 Contist 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 MZusä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.

Li-yao Xia
quelle