Niech będzie CCC . Niech być bifunctor produkt na . Ponieważ Cat to CCC, możemy curry :( × ) C ( × )
Kategoria funktora ma zwykłą strukturę monoidalną. Monoid w jest monada w . Uważamy produktów skończonych jak monoidal struktury na .
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.
Teraz, dla konkretności, rozwijam konstrukcję Writer.
Zaczynać. W rzeczywistości , po prostu mają różne nazwy w Haskell. Mamy monoid Haskella :
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:
naturalna transformacja, morfizmem w . Według właściwości jest to funkcja, która przyjmuje i daje morfizm w :
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 | ⟩
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 eη m e m p t y
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 ) 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:
{- 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 .C
- Pisarz
- Czytelnik
- Coreader
- Cowriter
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”.
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ć! ;)
Odpowiedzi:
Tak, jeśli monada ma prawe przyłączenie , wówczas automatycznie dziedziczy strukturę comonad.M:C→C N N
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. NapiszC D Fun(C,D) C D FunL(C,D) Fun(C,D) on the functors which have right adjoints (in other words, we consider functors C→D with right adjoints and arbitrary natural transformations between them). Write FR:D→C for the right adjoint of a functor F:C→D . Then −R:FunL(C,D)→Fun(D,C) is a contravariant functor: if α:F→G is a natural transformation then there is an induced natural transformation αR:GR→FR .
źródło
By the way, this:
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 withC 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:
whereC×D is a product of categories, and ED is the category of functors F:D→E . This works regardless of whether C , D and E are Cartesian closed, though. When we let C=D=E , we get:
But this is merely a special case of:
źródło
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×A→Y}≅{f∗:X→YA} . Or if it helps, −∗:hom(−×A,=×1)≅hom(−1,=A)
źródło