Die Monaden-Gesetze sind drei Gleichungen, die jede korrekte Monade erfüllen muss: Linksidentität, Rechtsidentität und Assoziativität. Sie stellen sicher, dass die Bausteine return und bind (>>=) zusammenpassen und dass monadische Programme sich vorhersagbar umformen lassen.
Die drei Gesetze
Für eine Monade m, einen Wert x, ein monadisches Ergebnis m und Funktionen f, g gelten:
- Linksidentität:
return x >>= fist gleichf x - Rechtsidentität:
m >>= returnist gleichm - Assoziativität:
(m >>= f) >>= gist gleichm >>= (x -> f x >>= g)
Die Linksidentität besagt, dass return einen Wert ohne Verpackung einhüllt; die Rechtsidentität, dass return das Ergebnis nicht verändert; die Assoziativität, dass die Klammerung der Verkettung egal ist — genau das erlaubt es, do-Blöcke umzuformulieren und Code zu refaktorieren, ohne die Bedeutung zu ändern.
Kategorientheoretische Sicht und Prüfung
In der Kategorientheorie ist eine Monade ein Endofunktor mit natürlichen Transformationen return (unit) und join (multiplication); die Gesetze entsprechen dann den Monoid-Gesetzen. Analog gibt es Funktor-Gesetze (fmap id = id, fmap (f . g) = fmap f . fmap g) und Applicative-Gesetze. Verletzt eine Implementierung die Gesetze, führt das zu subtilen Laufzeitfehlern — daher prüft man eigene Instanzen idealerweise mit Property-Based Testing. Klassische Beispiele: Maybe, Either, Listen, Monadentransformer.