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 >>= f ist gleich f x
  • Rechtsidentität: m >>= return ist gleich m
  • Assoziativität: (m >>= f) >>= g ist gleich m >>= (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.