Lettore, scrittore monadi


17

Sia un CCC . Let un bifunctor prodotto su . Dato che Cat è CCC, possiamo curry :C(×)C(×)

curry(×):C(CC)

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

La categoria Functor ha la consueta struttura monoidale. CC Un monoide in è una monade in . CCC Consideriamo prodotti finiti come struttura monoidale su .C

curry(×)1id

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

Pertanto conserva la struttura monoidale, quindi trasporta un monoide in una monade e un comonoide in una comonade. Vale a dire, trasporta un monoide arbitrario in monade (guarda la definizione - deve essere un monoide). Allo stesso modo trasporta il comonoide diagonale al comonad di Coreader.(curry(×))w(Writer w)w

Ora, per concretezza, ho spiegato la costruzione di Writer.

Inizio. In realtà , hanno semplicemente nomi distinti in Haskell. Abbiamo un monoide Haskell :Writer=Coreader=curry(×) w,mappend,mempty

mappend:w×ww

mempty:1w

Writer è un funzione, quindi deve mappare anche i morfismi, come e . Scrivo questo come di seguito, sebbene non sia valido in Haskell:m e m p t ymappendmempty

Writer mappend:Writer(w×w)Writer w

Writer mappend è una trasformazione naturale, un morfismo in . Per proprietà del è una funzione, che prende e dà un morfismo in :c u r r y ( × ) a O b ( C ) CCCcurry(×)aOb(C)C

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

Informalmente, somme componenti di tipo e pompe intatto. Questa è esattamente la definizione di Writer in Haskell. Un ostacolo è che per la monade abbiamo bisognow un W r i t e r w , μ , η Writer mappend awaWriter w,μ,η

μ:Writer wWriter wWriter w

cioè incompatibilità dei tipi. Ma questi funzioni sono isomorfi: dal solito associatore per prodotti finiti che è un isomorfismo naturale . Quindi definiamo tramite . una costruzione di via .λ 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, essendo un funzione, conserva diagrammi commutativi, vale a dire preserva le uguaglianze monoide, quindi abbiamo per scontato uguaglianze comprovate per = un monoide in = una monade in . Fine.( C C ) CWriter w,μ,η(CC)C

Che dire di Reader e Cowriter? Reader è aggiunto a Coreader, come spiegato nella definizione di Coreader, vedere il link sopra. Allo stesso modo, Cowriter è aggiunto a Writer. Non ho trovato una definizione di Cowriter, quindi l'ho inventata per analogia nella tabella:

testo alternativo

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

Di seguito sono riportate le definizioni semplificate di quelle (co) monadi. fr_ob F indica una mappatura di un funzione F su oggetti, fr_mor F indica una mappatura di un funzione F su morfismi. C'è un oggetto monoide in .Cw,+^,0^C

  • scrittore
    • 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
  • Lettore
    • 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)

La domanda è che l'aggiustamento in riferisce ai funzioni, non alle monadi. Non vedo come l'aggiunta implica "Coreader è una comonade" "Reader è una monade" e "Writer è una monade" "Cowriter è una comonade".C

Osservazione. Sto lottando per fornire più contesto. Richiede un po 'di lavoro. Soprattutto, se hai bisogno di purezza categorica e quelle (co) monadi sono state introdotte per i programmatori. Continua a tormentarti! ;)


Offerta: puoi fare uno screenshot al tavolo e mettere qui l'immagine.
MS Dousti,

Dovresti copiare la domanda qui.
Dave Clarke,

2
le persone che effettuano il downvoting devono pubblicare un commento che spieghi il perché.
Suresh Venkat,

1
@Ohad. Confesso che ho introdotto quella modifica per cercare di fornire alla domanda un maggior contesto (come è stato originariamente trovato nel post del blog a cui si fa riferimento in origine). Penso che il beroal dovrebbe spendere di più per rendere la sua domanda autonoma, ad esempio, definendo quali Reader e Writer e Coreader e Cowriter sono in termini categorici o in Haskell o in entrambi, piuttosto che assumere che tutti sappiamo a cosa si sta riferendo.
Dave Clarke,

2
@beroal: Volevo dire che, dato che non uso Haskell quotidianamente, analizzare il codice Haskell e fare la transizione in CT non è banale per me, e forse per altri. Riformulando la domanda in termini puramente categorici, è più probabile che tu riceva una risposta più rapidamente ...
Ohad Kammar

Risposte:


13

Sì, se una monade ha una aggiunta a destra , allora eredita automaticamente una struttura di comonad.M:CCNN

L'impostazione teorica di categoria generale per comprendere ciò è la seguente. Sia e due categorie. Scrivi per la categoria dei funzioni da a ; I suoi oggetti sono funzionali e i suoi morfismi trasformazioni naturali. Scrivi per l'intera sottocategoria di sui funzione che hanno i giusti aggiustamenti (in altre parole, consideriamo i funzioni da con i giusti giunti e trasformazioni naturali arbitrarie tra loro). Scrivi per il diritto adjoint di un funtore . PoiCDFun(C,D)CDFunL(C,D)Fun(C,D)CDFR:DCF:CDR:FunL(C,D)Fun(D,C) è un funzione contraddittoria: se è una trasformazione naturale, allora c'è un indotto trasformazione naturale .α:FGαR:GRFR

Se , allora ha una struttura monoidale data dalla composizione e così anche , perché la composizione delle giunture a sinistra è una aggiunta a sinistra. In particolare, , quindi è un funzione antimonoidale contravariante. Se si applica alle trasformazioni naturali strutturali che equipaggiano un funzione con la struttura di una monade, ciò che si ottiene è una comonade.C=DFun(C,C)FunL(C,D)(FG)R=GRFRRRM


1
E si dovrebbe menzionare che alcuni di questi funzioni, ad esempio non è in realtà un funzione ma piuttosto qualcosa come uno pseudo-funzione perché in genere soddisfa la funzionalità solo fino agli isomorfismi canonici. Tuttavia, il punto principale è valido. R
Andrej Bauer,

7

A proposito, questo:

Let sia un prodotto in bifunctor C . Dato che C è CCC, possiamo curry ( × )(×)CC(×)

è leggermente errato. Per uno, in termini usuali sarebbe (se non mi sbaglio) che è un bifunctor sopra o su C . "In" significa in genere costruzioni che utilizzano le frecce e gli oggetti di una categoria, mentre i categorie "on" di funzioni si riferiscono a costruzioni relative a più categorie. E il bifunctor del prodotto non è una costruzione all'interno di una categoria cartesiana.×C

E questo si riferisce alla maggiore inesattezza: la capacità di curry del bifunctor del prodotto non ha nulla a che fare con la chiusura cartesiana di Piuttosto, è possibile perché C a t , la categoria di categorie (inserire avvertenze) è cartesiana chiusa. Quindi il curry in questione è dato da:CCat

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

dove è un prodotto di categorie, ed E D è la categoria dei funtori F : D E . Funziona indipendentemente dal fatto che C , D ed E siano chiusi cartesiani. Quando lasciamo C = D = E , otteniamo:C×DEDF:DECDEC=D=E

c u r r y × : C C C

×:C×CC
curry×:CCC

Ma questo è solo un caso speciale di:

c u r r y F : C E D

F:C×DE
curryF:CED

2 Dan Doel: Sì, sì, sì, grazie. Ho fatto l'errore durante la traduzione dal post originale beroal.livejournal.com/23223.html .
beroal,

4

Si consideri l'aggiunzione . Per ogni tale dell'aggiunzione abbiamo una monade G F , η , G ε F e anche un comonad F G , ε , F η G . In particolare, F e G non devono essere endofunctors, e in generale non sono (per esempio, l'elenco Monade è un adjuction tra i funtori libere e smemorati tra S e T e M o nF,G,ϵ,ηGF,η,GϵFFG,ϵ,FηGFGSetMon).

Quindi, quello che vuoi fare è prendere Reader (o Writer) e scomporlo in funzioni aggiunte che danno origine alla monade e al corrispondente comonad. Vale a dire che la connessione tra Reader e Coreader (o Writer e Cowriter) non è quella che stai cercando.

Ed è probabilmente meglio a pensare a come currying , vale a dire X , Y . { f : X × A Y } { f : X Y A } . O se aiuta, - : hom ( - × A ,:hom(×A,=)hom(,=A)X,Y. {f:X×AY}{f:XYA}:hom(×A,=×1)hom(1,=A)


2 wren ng thornton: non sono a conoscenza di alcuna aggiunta definita per Reader e Writer simile alle aggiunte tra Set e una categoria di strutture algebriche. O vuoi dire che ogni monade è definita da un'aggiunta come in "MacLane. Categorie per il matematico che lavora. VI. Monadi e algebre. 2. Algebre per una monade. Teorema 1 (Ogni monade è definita dalle sue T-algebre). "? Può essere più preciso? In realtà la mia domanda è la conclusione di un tentativo di definire quelle (co) monadi in parole eleganti come lo è la monade della lista.
beroal,

@beroal: Sono abbastanza sicuro che Reader e Writer non siano vicini, o almeno devo ancora trovare un modo per far sì che le categorie lavorino per questo. No, il mio punto era che monadi e comonadi sorgono "allo stesso modo", vale a dire tramite un aggancio, come descritto sopra. Non ho una copia di MacLane, ma sì le algebre sono il nome standard per il trucco sopra (ma poi di nuovo, ogni sorta di cose non correlate sono chiamate "X-algebre", "Y-algebre", ... ). T
Wren Romano,

Quale descrizione della monade lista stai cercando di abbinare all'eloquenza di? Dato il funzione monoide libera , il funzione smemorato U : M o nS e t , la trasformazione di unità η : id S e tU F e la trasformazione di unità ϵ : F U id M o n si ha un'aggiunzione F , U ,F:SetMonU:MonSetη:idSetUFϵ:FUidMon . Il che significa che hai una monadeU F , η , U ε F , vale a dire l'elenco monade in S e t . E si ottiene l'elenco comonad in M o n :F U , ε , F η U . Eloquente? F,U,η,ϵUF,η,UϵFSetMonFU,ϵ,FηU
Wren Romano,

I portatori (Reader a) e (Writer a) sono aggiunti e tale aggiunta dà origine alla monade (Stato a).
beroal,

"No, il mio punto era che monadi e comonadi sorgono" allo stesso modo ", vale a dire tramite un aggancio, come descritto sopra". Se ottieni la monade e la comonade dall'aggiustamento tra le categorie Set e Mon, ottieni la monade su Set e la comonade su Mon - diverse categorie. Ma Reader e Writer appartengono alla stessa categoria CCC.
Beroal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.