Spiegazione del funzionario applicativo in termini categorici - funzione monoidale


40

Mi piacerebbe capire Applicativein termini di teoria delle categorie.

La documentazione per Applicativedice che si tratta di un forte funzione lenta monoidale .

In primo luogo, la pagina di Wikipedia sui funzioni monoidali afferma che un funzione monoida è lassista o forte . Quindi mi sembra che una delle fonti sia sbagliata o che usino i termini in modo diverso. Qualcuno può spiegarlo?

In secondo luogo, quali sono le categorie monoidali dei quali Applicativesono i funzioni monoidali? Presumo che i funzioni siano endo-funzioni nella categoria standard di Haskell (oggetti = tipi, morfismi = funzioni), ma non ho idea di quale sia la struttura monoidale in questa categoria.

Grazie per l'aiuto.

Risposte:


35

In realtà ci sono due usi della parola "forza" in gioco qui.

  • Un forte endofunctor su una categoria monoidale è uno che viene fornito con una trasformazione naturale , soddisfacente alcune condizioni di coerenza rispetto all'associatario di cui parlerò. Questa condizione è talvolta pronunciata anche " ha una forza".( C , , I ) σ : A F ( B ) F ( A B ) FF:CC(C,,I)σ:AF(B)F(AB)F

  • Un lassista monoidale è un funzione tra due categorie monoidali (C, \ otimes, I) e (D, \ oplus, J) con trasformazioni naturali \ phi: F (A) \ oplus F (B) \ a F (A \ otimes B) e i: J \ a F (I) , soddisfacendo nuovamente una condizione di coerenza rispetto agli associati.( C , , I ) ( D , , J ) ϕ : F ( A ) F ( B ) F ( A B ) i : J F ( I )F:CD(C,,I)(D,,J)ϕ:F(A)F(B)F(AB)i:JF(I)

  • Un forte funzione monoideale da è uno in cui ed sono isomorfismi naturali. Cioè, , con e il suo inverso che descrivono l'isomorfismo.ϕ i F ( A B )F:CDϕiF(AB)F(A)F(B)ϕ

Un funzionario applicativo, nel senso dei programmi di Haskell, è un endofunctor lassista monoideale con una forza , con la struttura monoidale in questione essendo i prodotti cartesiani. Questo è il motivo per cui si ottiene il termine dal suono paradossale "forte funzione monoidale lassista".

Per inciso, in una categoria chiusa cartesiana, che ha una forza equivale all'esistenza di una trasformazione naturale . Cioè, avere una forza significa che l'azione funzionale è definibile come una funzione di ordine superiore nel linguaggio di programmazione.m a p : ( A B ) ( F ( A ) F ( B ) )Fmap:(AB)(F(A)F(B))

Infine, se sei interessato alla teoria dei tipi di funzioni applicative in stile Haskell, ho appena scritto un blog al riguardo.


1
Grazie per la risposta. Capisco correttamente che tutte le istanze di Functorhanno un punto di forza (prodotto WRT), semplicemente perché sono definite usando fmapall'interno della lingua? Inoltre, cosa mi fa pensare che la tua definizione di e sia invertita rispetto sia al tuo post sul blog che all'articolo di Wikipedia - è un errore di battitura? Ho provato a definire usando come , che chiaramente ha bisogno . ioϕipureipure' = \v -> fmap (\() -> v) (i ())i :: (Applicative f) => () -> f ()
Petr Pudlák,

1
Ho avuto un refuso in questa risposta - ora risolto. E sì, tutti i casi di Functorsono forti (prodotto wrt).
Neel Krishnaswami,

Potresti per favore anche elaborare la posizione di Monad? Se ho capito bene, è anche un endofunctor monoideale.
egdmitry,

@egdmitry Monoidal , non monadal . Ciò significa che abbiamo a che fare con un endofunctor di una categoria monoidale (in questo caso essendo monoidale rispetto al prodotto cartesiano, cioè coppie). Hask
Kirelagin,

Posso proporre di usare la parola forte per evitare lo scontro di notazione con "forte"? È una variazione dialettale scozzese (quindi particolarmente precisa qui) di "forte", usata per la prima volta nella Bibbia di Wycliffe.
Fosco,

3

Per capire l'Applicativo, come indotto da una monade, voglio sottolineare la seguente costruzione:

Il lemma di Yoneda implica che esiste un isomorfismo tra e n a t ( H o m ( A , B ) , F B ) . Nella categoria di tipi di Haskell, questa è la mappatura di un ( g F ( g ) ( un ) ) di tipo F A B AF B . Valutando a F AFAnat(Hom(A,B),FB)

a(gF(g)(a))
FABAFB.
FA, quindi applicando la mappa delle frecce dei funzione alla funzione risultante - se i componenti della trasformazione naturale hanno senso come frecce - e astrattando nuovamente , otteniamo una mappatura di tipo F A FFA Ora se il funzione viene fornito con un 'join' monadico, mappando da F F B a F B , e se cambiamo le astrazioni lambda e quindi i primi due argomenti, possiamo ottenere una funzione di tipo F
FAFBAFFB.
FFBFB che è indicato da <*>. (Questo è anche ciò che ottieni tramite L i f t M 2 i d in Haskell.)
FBAFAFB,
LiftM2 id
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.