Ein Applicative-Functor (auch Applikativ oder applicativer Funktor) ist eine Zwischenstufe zwischen Funktor und Monade. Während ein Funktor nur eine Funktion mit einem Argument in einen Kontext heben kann, erlaubt der Applicative-Functor auch Funktionen mit mehreren Argumenten und Kombinationen von Werten aus mehreren Kontexten.

Die Bausteine

Ein Applicative-Functor erweitert einen Funktor um zwei Operationen:

pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b

pure hebt einen gewöhnlichen Wert in den Kontext. Der Operator <*> (englisch „ap“) wendet eine Funktion, die bereits im Kontext liegt, auf einen Wert im Kontext an. Damit lassen sich Funktionen mit mehreren Argumenten nacheinander mit Werten füttern, die jeweils in einem Kontext stecken.

Gesetze

Applicative-Funktoren müssen vier Gesetze erfüllen: Identity, Homomorphism, Interchange und Composition. Sie sichern, dass pure und <*> sich wie erwartet verhalten und dass die Reihenfolge der Argumente verträglich mit der Funktionsanwendung ist.

Anwendungen

Ein klassisches Anwendungsgebiet ist die Validierung: Mit einem Applicative-Funktor lassen sich mehrere unabhängige Prüfungen kombinieren und alle Fehler auf einmal sammeln, statt nach dem ersten abzubrechen. Auch Parser-Kombinatoren bauen auf Applicative-Funktoren auf. In JavaScript erinnert Promise.all an die applicative Kombination unabhängiger Berechnungen, in TypeScript bietet die Bibliothek fp-ts applicative Strukturen an.

Unterschied zur Monade

Der entscheidende Unterschied: Beim Applicative-Functor sind die Berechnungen unabhängig — die Struktur der Kombination ist statisch, jede Teilberechnung kennt das Ergebnis der anderen nicht. Eine Monade erlaubt dagegen abhängige Berechnungen, bei denen das nächste Ergebnis vom vorherigen abhängt (bind). Diese Trennung macht applicative Kombinationen oft einfacher zu analysieren und zu parallelisieren.

Verwandte Grundlagen: Funktor, Monade, Listen-Monade, Funktionale Programmierung, Currying, Haskell-Befehle, TypeScript-Befehle.