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.