Einstieg

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 Flagge Großbritanien - Online-Kurs über Principles of Reactive Programming (dt. Prinzipien der reaktiven Programmierung) Flagge Großbritanien [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.

Monad - Bedingungen

Damit ein Monad ein Monad ist muss nach "harten" Bedingungen folgendes für den entsprechenden Typ gegeben sein1:

  • Es muss eine Funktion flatMap[U](f: T => M[U]) => M[U]) definiert sein, wobei M[U] wiederum ein Monad ist.

  • Es nuss eine Funktion 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).

  • Monaden verhalten sich assoziativ.

  • Monaden erfüllen das "Left - unit" Gesetz.

  • Monaden erfüllen das "Right - unit" Gesetz.

Beispielklassen

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.

  • Die Klasse List mit List(x) als unit - Funktion.

  • Die Klasse Set mit Set(x) als unit - Funktion.

  • Die Klasse Option mit Some(x) als unit - Funktion.

Assoziation

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)
            

"Left - unit" Gesetz

unit(x) flatMap f = f(x)
            

"Right - unit" Gesetz

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 Flagge Großbritanien

Online Kurs zu reaktiven Programmierung mit Scala als Programmiersprache.

______________________________
1 Vergleiche: [40] - Week 1