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ć! ;)