Erklärung des anwendbaren Funktors in kategorialen Begriffen - monoide Funktoren

40

Ich möchte Applicativein Bezug auf die Kategorietheorie verstehen .

Die Dokumentation für Applicativesagt, dass es ein starker laxer monoidaler Funktor ist .

Erstens sagt die Wikipedia-Seite über monoide Funktoren , dass ein monoider Funktor entweder lasch oder stark ist . Mir scheint also, dass entweder eine der Quellen falsch ist oder sie die Begriffe anders verwenden. Kann das jemand erklären?

Zweitens, welche monoiden Kategorien Applicativesind monoide Funktoren? Ich gehe davon aus, dass es sich bei den Funktoren um Endofunktionen in der Standardkategorie von Haskell handelt (Objekte = Typen, Morphismen = Funktionen), aber ich habe keine Ahnung, wie die monoidale Struktur in dieser Kategorie lautet.

Danke für die Hilfe.

Petr Pudlák
quelle

Antworten:

35

Tatsächlich gibt es hier zwei Verwendungen des Wortes "Stärke".

  • Ein starker Endofunktor über eine monoidale Kategorie ist einer, der mit einem natürlichen Transformations- , befriedigend Einige Kohärenzbedingungen in Bezug auf den Assoziator, die ich beschönigen werde. Diese Bedingung wird manchmal auch ausgesprochen " hat eine Stärke".( C , , I ) σ : A F ( B ) F ( A B ) FF:CC(C,,I)σ:AF(B)F(AB)F

  • Ein laxer monoidaler Funktor ist ein Funktor zwischen zwei monoidalen Kategorien und mit natürlichen Transformationen und , wobei wiederum eine Kohärenzbedingung in Bezug auf die Assoziatoren erfüllt ist.F:CD(C,,I)(D,,J)ϕ:F(A)F(B)F(AB)i:JF(I)

  • Ein starker monoidaler Funktor ist einer, bei dem und natürliche Isomorphismen sind. Das heißt, , wobei und seine Umkehrung den Isomorphismus beschreiben.F:CDϕiF(AB)F(A)F(B)ϕ

Ein applikativer Funktor im Sinne von Haskell-Programmen ist ein schlaffer monoidaler Endofunktor mit einer Stärke , wobei es sich bei der monoidalen Struktur um die kartesischen Produkte handelt. Aus diesem Grund erhalten Sie den paradox klingenden Begriff "stark laxer monoidaler Funktor".

Abgesehen davon ist in einer geschlossenen kartesischen Kategorie mit einer Stärke gleichbedeutend mit der Existenz einer natürlichen Transformation . Das heißt, eine Stärke zu haben, bedeutet, dass die Funktionsaktion in der Programmiersprache als Funktion höherer Ordnung definierbar ist.Fmap:(AB)(F(A)F(B))

Wenn Sie sich für die Typentheorie von anwendungsbezogenen Funktoren im Haskell-Stil interessieren, habe ich gerade darüber gebloggt.

Neel Krishnaswami
quelle
1
Danke für die Antwort. Verstehe ich es richtig, dass alle Instanzen von Functoreine Stärke haben (WRT-Produkt), einfach weil sie fmapin der Sprache definiert sind? Und was wundert mich, dass Ihre Definition von und im Vergleich zu Ihrem Blog-Post und dem Wikipedia-Artikel umgekehrt ist - ist es ein Tippfehler? Ich habe versucht mit als zu definieren , was eindeutig benötigt wird . ϕipureipure' = \v -> fmap (\() -> v) (i ())i :: (Applicative f) => () -> f ()
Petr Pudlák
1
Ich hatte einen Tippfehler in dieser Antwort - jetzt behoben. Und ja, alle Instanzen von Functorsind stark (für Produkt).
Neel Krishnaswami
Könnten Sie bitte auch erläutern, wo Monad steht? Wenn ich richtig verstehe, ist es auch ein monoidaler Endofunktor.
egdmitry
@egdmitry Monoidal , nicht monadal . Dies bedeutet, dass wir es mit einem Endofunktor einer monoidalen Kategorie zu tun haben (in diesem Fall ist in Bezug auf ein kartesisches Produkt, dh Paare). Hask
kirelagin
Darf ich das Wort vorschlagen strengthy zu vermeiden Kampf der Schreibweise mit „strong“? Es ist eine schottische (hier besonders auf den Punkt gebrachte) dialektale Variante von "stark", die erstmals in Wycliffes Bibel verwendet wird.
Fosco
3

Um Applicative zu verstehen, wie es von einer Monade induziert wird, möchte ich auf die folgende Konstruktion hinweisen:

Das Yoneda-Lemma impliziert, dass es einen Isomorphismus zwischen und . In der Kategorie der Haskell-Typen ist dies die Zuordnung vom Typ Bei , dann die Pfeilzuordnung der Funktoren auf die resultierende Funktion anwenden - wenn die Komponenten der natürlichen Transformation als Pfeile sinnvoll sind - und erneut abstrahieren , erhalten wir eine Zuordnung vom Typ Wenn der Funktor nun mit einem monadischen 'Join' geliefert wird, wird das Mapping von zuFAnat(Hom(A,B),FB)

a(gF(g)(a))
FABAFB.
FAFA
FAFBAFFB.
FFBFB, und wenn wir die Lambda-Abstraktionen und damit die ersten beiden Argument-Slots umschalten, können wir eine Funktion vom Typ die man mit <*> bezeichnet. (Dies erhalten Sie auch über in Haskell.)L i f t M 2 i d
FBAFAFB,
LiftM2 id
Nikolaj-K
quelle