Was ist ein Monad? Hier können wir wie Rechtsanwälte Antworten: Es kommt darauf an. Es kommt darauf an, wie "scharf" an der Theorie man Monaden definiert. Eine wichtige Eigenschaft von Monaden ist das "Verpacken" eines komplexeren Datentyps in einen weniger (zur Weiterverarbeitung geeignetereren) komplexen Datentyp.
Ein gutes Beispiel, warum es darauf ankommt, ist der Cousera
- Online-Kurs über
Principles of Reactive Programming (dt. Prinzipien der
reaktiven Programmierung)
[SQ5].
Im gleichen Kurs (mit drei Instruktoren) ist für einen (Martin Odersky)
es notwendig, dass ein Monad zwei bestimmte Funktionen unterstützt und das bestimmte Gesetzmäßigkeiten
gegeben sind. Für den anderen Instruktor (Erik Meijer) reicht es aus, das der Datentyp eine Funktion namens
flatMap bietet. In der Literatur der funktionalen Programmierung wird für flatMap
häufig auch der Begriff bind verwendet. Da aber flatMap in Scala bereits
etabliert ist, wird dieser Name in Scala verwendet.
Damit ein Monad ein Monad ist muss nach "harten" Bedingungen folgendes für den entsprechenden Typ gegeben sein1:
flatMap[U](f: T => M[U]) => M[U]) definiert sein, wobei M[U] wiederum
ein Monad ist.
unit[T](x: T): M[T] definiert sein, wobei M[T] wiederum ein Monad ist.
Die Funktion muss nicht unit heissen. Am Beispiel des Monaden Option heißt die Funktion
Some(x).
In der Scala Standardbibliothek sind bereits mehrere Typen definiert, welche die Bedinungen für einen Monad erfüllen. Nachfolgend einige Beispiele, wobei auf den Beweis, dass es sich um Monaden handelt, verzichtet wird.
List mit List(x) als unit - Funktion.
Set mit Set(x) als unit - Funktion.
Option mit Some(x) als unit - Funktion.
a flatMap b flatMap c == a flatMap b flatMap c
(a flatMap b) flatMap c == a flatMap (b flatMap c)
(a flatMap b) flatMap c == a flatMap (x => b(x) flatMap c)
unit(x) flatMap f = f(x)
a flatMap unit == a
de.wikipedia.org
Monade (Informatik)
http://de.wikipedia.org/wiki/Monade_(Informatik)
Martin Odersky, Erik Meijer, Ronald Kuhn
Principles of Reactive Programming
https://www.coursera.org/course/reactive

Online Kurs zu reaktiven Programmierung mit Scala als Programmiersprache.