Ein Effect-System erweitert ein statisches Typsystem so, dass die Seiteneffekte einer Funktion Teil ihrer Signatur werden. Während eine normale Typannotation nur sagt, welchen Wert eine Funktion liefert, sagt die Effektannotation zusätzlich, welche Effekte sie dabei ausführen darf — etwa Ein-/Ausgabe, Zustandsänderung oder Fehler.
Grundidee
In einer effekttypisierten Sprache wie Koka oder Effekt hat eine Funktion eine Signatur der Form fun leseDatei() : string / io: Sie gibt einen String zurück und darf den Effekt io verwenden. Der Compiler prüft bei jedem Aufruf, ob die Effekte zusammenpassen, und kann so unerlaubte Seiteneffekte schon zur Übersetzungszeit ablehnen. Effekttypen lassen sich mit Effektvariablen polymorph machen, sodass generische Funktionen mit beliebigen Effekten arbeiten können.
Algebraische Effekte und Handler
Die moderne Ausprägung sind algebraische Effekte mit Handlern: Eine Funktion meldet einen Effekt mit perform, ein Handler fängt ihn ab und kann die Berechnung an der Unterbrechungsstelle fortsetzen. Das erinnert an Exceptions, ist aber mächtiger, weil der Handler Werte an den Aufrufpunkt zurücksenden kann. OCaml 5 bringt seit 2022 algebraische Effekte und Handler eingebaut mit; Koka (Microsoft Research) und Effekt sind eigene Forschungs- und Praxis-Sprachen, Unison unterstützt sie ebenfalls. Im TypeScript-Umfeld emuliert Effect-TS ein Effekt-System über Bibliotheks-Monaden.
Abgrenzung zu Monaden
Monaden kapseln Effekte als Bibliothekskonstrukt: Der Programmierer schreibt do-Notation und muss bei verschachtelten Effekten oft Monadentransformer stapeln. Ein Effect-System dagegen ist in die Sprache eingebaut, der Typ prüft die Effekte direkt, und Handler ersetzen die manuelle Stapel-Verwaltung. Das erleichtert Komposition und verbessert die Typsicherheit, verlangt aber eine spezielle Sprache oder einen Compiler mit Effektunterstützung. Verwandte Grundlagen: Typsystem, IO-Monade, Funktionale Programmierung.