Czytnik, pisarz monady

17

Niech będzie CCC . Niech być bifunctor produkt na . Ponieważ Cat to CCC, możemy curry :( × ) C ( × )C(×)C(×)

curry(×):C(CC)

curry(×)A=λB.A×B

Kategoria funktora ma zwykłą strukturę monoidalną. CC Monoid w jest monada w . CCC Uważamy produktów skończonych jak monoidal struktury na .C

curry(×)1id

A B.curry(×)(A×B)(curry(×)A)(curry(×)B)

Dlatego zachowuje strukturę monoidalną, więc transportuje monoid do monady, a comonoid do comonady. Mianowicie, przenosi ona dowolną monoidę do monady (spójrz na definicję - musi być monoidą). Podobnie przenosi diagonalny comonoid do comonada Coreadera.(curry(×))w(Writer w)w

Teraz, dla konkretności, rozwijam konstrukcję Writer.

Zaczynać. W rzeczywistości , po prostu mają różne nazwy w Haskell. Mamy monoid Haskella :Writer=Coreader=curry(×) w,mappend,mempty

mappend:w×ww

mempty:1w

Writer jest funktorem, więc musi mapować także morfizmy, takie jak i . Piszę to jak poniżej, choć jest to nieprawidłowe w Haskell:mappendmmimpty

Writer mappend:Writer(w×w)Writer w

Writer mappend naturalna transformacja, morfizmem w . Według właściwości jest to funkcja, która przyjmuje i daje morfizm w :CCcurry(×)aOb(C)C

Writer mappend a=mappend×(id(a)):Writer(w×w)aWriter w a

Nieformalnie, sumuje elementy typu i pompy nienaruszone. To jest dokładnie definicja Writer w Haskell. Jedną przeszkodą jest to, że dla monad potrzebujemyw W r i t e r w , μ , r | Writer mappend awaWriter w,μ,η

μ:Writer wWriter wWriter w

tj. niezgodność typów. Ale te funktory są izomorficzne: przez zwykłego asocjatora dla produktów skończonych, który jest naturalnym izomorfizmem . Następnie definiujemy przez . Pomijam budowę przez .λ 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 eWriter(w×w)=λa.(w×w)×aλa.w×(w×a)=Writer wWriter wμη m e m p t yWriter mappendηmempty

Writer, będący funktorem, zachowuje diagramy przemienne, tzn. Zachowuje równości monoidów, więc z góry udowodniliśmy równości dla = monoid w = monada w . Koniec.( C C ) CWriter w,μ,η(CC)C

Co z Czytelnikiem i Cowriter? Czytelnik jest połączony z Coreaderem, jak wyjaśniono w definicji Coreadera, patrz link powyżej. Podobnie Cowriter przylega do Writer. Nie znalazłem definicji Cowriter, więc wymyśliłem ją przez analogię pokazaną w tabeli:

alternatywny tekst

{- 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')))

Poniżej znajdują się uproszczone definicje tych (ko) monad. fr_ob F oznacza odwzorowanie funktora F na obiektach, fr_mor F oznacza odwzorowanie funktora F na morfizmach. Jest to obiekt monoid w .Cw,+^,0^C

  • Pisarz
    • fr_ob(Writer w)a=a×w
    • fr_mor(Writer w)f=λa0,w2.a0,f w2
    • ηa=λa0.a0,0^
    • μa=λa0,w1,w0.a0,w0+^w1
  • Czytelnik
    • fr_ob(Reader r)a=ra
    • fr_mor(Reader r)f=λg r0.f(g r0)
    • ηa=λa0 r0.a0
    • μa=λf r0.f r0 r0
  • Coreader
    • fr_ob(Coreader r)a=r×a
    • fr_mor(Coreader r)f=λr0,a0.f r0,a0
    • ηa=λr0,a0.a0
    • μa=λr0,a0.r0,r0,a0
  • Cowriter
    • fr_ob(Cowriter w)a=wa
    • fr_mor(Cowriter w)f=λg r0.f(g r0)
    • ηa=λf.f 0^
    • μa=λf w1w0.f(w0+^w1)

Pytanie brzmi, że dodatek w dotyczy funktorów, a nie monad. Nie rozumiem, jak to powiązanie sugeruje, że „Coreader to comonada” „Reader to monada”, a „Writer to monada” „Cowriter to comonada”.C

Uwaga. Usiłuję zapewnić więcej kontekstu. Wymaga trochę pracy. Zwłaszcza jeśli potrzebujesz jakościowej czystości, a te (ko) monady zostały wprowadzone dla programistów. Nie przestawaj dokuczać! ;)

beroal
źródło
Oferta: Możesz zrobić zrzut ekranu stołu i umieścić obraz tutaj.
MS Dousti,
Powinieneś skopiować pytanie tutaj.
Dave Clarke,
2
osoby oddające głos powinny opublikować komentarz wyjaśniający dlaczego.
Suresh Venkat,
1
@Ohad. Przyznaję, że wprowadziłem tę zmianę, aby spróbować nadać pytaniu szerszy kontekst (jak pierwotnie znaleziono w poście na blogu, do którego pierwotnie przywołano). Myślę, że beroal powinien poświęcić więcej wysiłku, aby jego pytanie było samowystarczalne, na przykład, definiując, czym są Czytelnik i Pisarz oraz Coreader i Cowriter w kategoriach kategorycznych lub w Haskell lub obu, zamiast zakładać, że wszyscy wiemy, o czym mowa.
Dave Clarke
2
@beroal: Miałem na myśli to, że ponieważ nie używam Haskell na co dzień, analizowanie kodu Haskell i przejście do CT nie jest dla mnie trywialne i być może inne. Przeformułowując pytanie w kategoriach czysto kategorycznych, bardziej prawdopodobne jest, że otrzymasz odpowiedź szybciej ...
Ohad Kammar

Odpowiedzi:

13

Tak, jeśli monada ma prawe przyłączenie , wówczas automatycznie dziedziczy strukturę comonad.M:CCNN

Ogólne ustawienie teoretyczne kategorii, aby to zrozumieć, jest następujące. Niech i będą dwiema kategoriami. Napisz dla strategii funktorów od do ; Jego obiektami są funktory, a morfizmy naturalne przekształcenia. NapiszCDFun(C,D)CDFunL(C,D)Fun(C,D) on the functors which have right adjoints (in other words, we consider functors CD with right adjoints and arbitrary natural transformations between them). Write FR:DC for the right adjoint of a functor F:CD. Then R:FunL(C,D)Fun(D,C) is a contravariant functor: if α:FG is a natural transformation then there is an induced natural transformation αR:GRFR.

C=DFun(C,C)FunL(C,D), because the composition of left adjoints is a left adjoint. Specifically, (FG)R=GRFR, so R is an antimonoidal contravariant functor. If you apply R to the structural natural transformations which equip a functor M with the structure of a monad, what you get out is a comonad.

Reid Barton
źródło
1
And one should mention that some of these functors, for example R is not really a functor but rather something like a pseudo-functor because it typically satisfies functoriality only up to canonical isomorphisms. Nevertheless, the main point is valid.
Andrej Bauer
7

By the way, this:

Let (×) be a product bifunctor in C. As C is CCC, we can curry (×)

is slightly incorrect. For one, the usual terminology would be (if I'm not mistaken) that × is a bifunctor over or on C. "In" typically means constructions using the arrows and objects of a category, whereas functors "on" categories refer to constructions relating multiple categories. And the product bifunctor isn't a construction within a Cartesian category.

And this relates to the larger inaccuracy: the ability to curry the product bifunctor has nothing to do with C being Cartesian closed. Rather, it is possible because Cat, the category of categories (insert caveats) is Cartesian closed. So the currying in question is given by:

HomCat(C×D,E)HomCat(C,ED)

where C×D is a product of categories, and ED is the category of functors F:DE. This works regardless of whether C, D and E are Cartesian closed, though. When we let C=D=E, we get:

×:C×CC
curry×:CCC

But this is merely a special case of:

F:C×DE
curryF:CED
Dan Doel
źródło
2 Dan Doel: Yes, yes, yes, thanks. I did the mistake while translating from the original post beroal.livejournal.com/23223.html .
beroal
4

Consider the adjunction F,G,ϵ,η. For every such adjunction we have a monad GF,η,GϵF and also a comonad FG,ϵ,FηG. Notably, F and G need not be endofunctors, and in general they aren't (e.g., the list monad is an adjuction between the free and forgetful functors between Set and Mon).

So, what you want to do is take Reader (or Writer) and decompose it into the adjoint functors which give rise to the monad and the corresponding comonad. Which is to say that the connection between Reader and Coreader (or Writer and Cowriter) isn't the one you're looking for.

And it's probably better to think of currying as :hom(×A,=)hom(,=A), i.e. X,Y. {f:X×AY}{f:XYA}. Or if it helps, :hom(×A,=×1)hom(1,=A)

wren romano
źródło
2 wren ng thornton: I am not aware of any defining adjunction for Reader and Writer similar to adjunctions between Set and a category of algebraic structures. Or do you mean that every monad is defined by an adjunction as in "MacLane. Categories for the Working Mathematician. VI. Monads and Algebras. 2. Algebras for a Monad. Theorem 1 (Every monad is defined by its T-algebras)."? Can you be more specific? Actually my question is the conclusion of an attempt to define those (co)monads in elegant words as the list monad is.
beroal
@beroal: I'm pretty sure Reader and Writer aren't adjoint, or at least I've yet to find a way to get the categories to work out for it. No, my point was that monads and comonads arise in "the same way", namely via an adjunction, as described above. I don't have a copy of MacLane, but yes T-algebras are the standard name for the trick above (but then again, all sorts of unrelated things are called "X-algebras", "Y-algebras",...).
wren romano
Which description of the list monad are you trying to match the eloquence of? Given the free monoid functor F:SetMon, the forgetful functor U:MonSet, the unit transformation η:idSetUF, and the counit transformation ϵ:FUidMon you have an adjunction F,U,η,ϵ. Which means you have a monad UF,η,UϵF, namely the list monad in Set. And you get the list comonad in Mon: FU,ϵ,FηU. Eloquent?
wren romano
Functors (Reader a) and (Writer a) are adjoint, and that adjunction gives rise to the (State a) monad.
beroal
"No, my point was that monads and comonads arise in "the same way", namely via an adjunction, as described above". If you get the monad and the comonad from the adjunction between categories Set and Mon, you get the monad on Set and the comonad on Mon — different categories. But Reader and Writer are on the same CCC category.
beroal