Nachdem ich vor einigen Jahren eine Antwort auf diese Frage gegeben habe, glaube ich, dass ich diese Antwort verbessern und vereinfachen kann mit...
Eine Monade ist eine Funktionskompositionstechnik, die die Behandlung einiger Eingabeszenarien durch eine Kompositionsfunktion externalisiert, bind
um die Eingabe während der Komposition vorzuverarbeiten.
In normaler Zusammensetzung, die Funktion, compose (>>)
wird verwendet, um die zusammengesetzte Funktion nacheinander auf das Ergebnis ihres Vorgängers anzuwenden. Wichtig ist, dass die komponierte Funktion alle Szenarien ihrer Eingabe verarbeiten muss.
(x -> y) >> (y -> z)
Dieser Entwurf kann verbessert werden, indem die Eingabe so umstrukturiert wird, dass relevante Zustände leichter abgefragt werden können. Anstatt also einfach y
kann der Wert zu Mb
wie zum Beispiel, (is_OK, b)
wenn y
einen Begriff der Gültigkeit enthalten.
Wenn die Eingabe zum Beispiel nur eine Zahl sein kann, könnten Sie, anstatt eine Zeichenkette zurückzugeben, die pflichtgemäß eine Zahl enthalten kann oder nicht, den Typ in eine bool
die das Vorhandensein einer gültigen Zahl und einer Zahl in einem Tupel wie, bool * float
. Die zusammengesetzten Funktionen müssten nun nicht mehr eine Eingabezeichenkette analysieren, um festzustellen, ob eine Zahl existiert, sondern könnten lediglich die bool
Teil eines Tupels.
(Ma -> Mb) >> (Mb -> Mc)
Auch hier erfolgt die Zusammensetzung natürlich mit compose
und so muss jede Funktion alle Szenarien ihrer Eingabe einzeln behandeln, obwohl dies jetzt viel einfacher ist.
Wie wäre es jedoch, wenn wir den Aufwand für Verhöre in den Fällen externalisieren könnten, in denen der Umgang mit einem Szenario Routine ist. Was wäre zum Beispiel, wenn unser Programm nichts tut, wenn die Eingabe nicht in Ordnung ist, z. B. wenn is_OK
es false
. Wenn dies der Fall wäre, müssten zusammengesetzte Funktionen dieses Szenario nicht selbst behandeln, was ihren Code drastisch vereinfacht und eine weitere Ebene der Wiederverwendung bewirkt.
Um diese Externalisierung zu erreichen, könnten wir eine Funktion verwenden, bind (>>=)
zur Durchführung der composition
anstelle von compose
. Anstatt also einfach Werte vom Ausgang einer Funktion auf den Eingang einer anderen zu übertragen Bind
würde die M
Teil von Ma
und entscheiden, ob und wie die zusammengesetzte Funktion auf die a
. Natürlich ist die Funktion bind
würde speziell für unseren Fall definiert werden M
um seine Struktur zu untersuchen und jede beliebige Art von Anwendung durchführen zu können. Nichtsdestotrotz ist die a
kann alles sein, da bind
reicht lediglich die a
ungeprüft an die zusammengesetzte Funktion, wenn sie die Anwendung für erforderlich hält. Außerdem müssen sich die zusammengesetzten Funktionen selbst nicht mehr mit dem M
Teil der Eingabestruktur, wodurch sie vereinfacht werden. Folglich...
(a -> Mb) >>= (b -> Mc)
oder knapper ausgedrückt Mb >>= (b -> Mc)
Kurz gesagt, eine Monade externalisiert und bietet damit ein Standardverhalten für die Behandlung bestimmter Eingabeszenarien, sobald die Eingabe so gestaltet ist, dass sie ausreichend offengelegt wird. Dieser Entwurf ist ein shell and content
Modell, bei dem die Hülle Daten enthält, die für die Anwendung der zusammengesetzten Funktion relevant sind, und die nur von der bind
Funktion.
Eine Monade besteht also aus drei Dingen:
- eine
M
Shell für die Aufnahme von monadenrelevanten Informationen,
- a
bind
eine Funktion, die so implementiert ist, dass sie diese Shell-Informationen bei der Anwendung der zusammengesetzten Funktionen auf den/die Inhaltswert(e), die sie in der Shell findet, verwendet, und
- komponierbare Funktionen der Form,
a -> Mb
und liefert Ergebnisse, die monadische Verwaltungsdaten enthalten.
Im Allgemeinen ist die Eingabe einer Funktion weitaus restriktiver als ihre Ausgabe, die z. B. Fehlerbedingungen enthalten kann; daher ist die Mb
Ergebnisstruktur ist im Allgemeinen sehr nützlich. Der Divisionsoperator gibt zum Beispiel keine Zahl zurück, wenn der Divisor 0
.
Zusätzlich, monad
s können Wrap-Funktionen enthalten, die Werte umbrechen, a
in den monadischen Typ, Ma
und allgemeine Funktionen, a -> b
in monadische Funktionen, a -> Mb
indem sie ihre Ergebnisse nach der Anwendung verpacken. Natürlich, wie bind
sind solche Umbruchfunktionen spezifisch für M
. Ein Beispiel:
let return a = [a]
let lift f a = return (f a)
Die Gestaltung der bind
Funktion geht von unveränderlichen Datenstrukturen und reinen Funktionen aus andere Dinge werden komplex und können nicht garantiert werden. Als solche gibt es monadische Gesetze:
Da...
M_
return = (a -> Ma)
f = (a -> Mb)
g = (b -> Mc)
Dann...
Left Identity : (return a) >>= f === f a
Right Identity : Ma >>= return === Ma
Associative : Ma >>= (f >>= g) === Ma >>= ((fun x -> f x) >>= g)
Associativity
bedeutet, dass bind
behält die Reihenfolge der Bewertung bei, unabhängig davon, wann bind
angewendet wird. Das heißt, in der Definition von Associativity
oben, die Kraft frühe Bewertung der eingeklammerten binding
de f
y g
führt nur zu einer Funktion, die erwartet Ma
zur Vervollständigung der bind
. Daher ist die Bewertung von Ma
muss bestimmt werden, bevor sein Wert auf die folgenden Bereiche angewendet werden kann f
und dieses Ergebnis wiederum gilt für g
.
13 Stimmen
Eric Lippert schrieb eine Antwort auf diese Fragen ( stackoverflow.com/questions/2704652/ ), die aufgrund einiger Probleme auf einer separaten Seite zu finden ist.
74 Stimmen
Hier ist eine neue Einführung in die Verwendung von Javascript - ich fand sie sehr lesenswert.
7 Stimmen
Siehe auch Verschiedene Arten, eine Monade zu sehen .
27 Stimmen
Siehe auch Monaden in Bildern
3 Stimmen
Eine Monade ist eine Reihe von Funktionen mit Hilfsoperationen. Siehe diese Antwort
0 Stimmen
Ein weiterer schneller Artikel, der der Antwort von sigfpe ähnelt: github.com/quchen/articles/blob/master/
0 Stimmen
Siehe meinen Artikel über FPComplete, in dem ich erkläre, WARUM man Monaden verwenden sollte (nicht wie sie funktionieren): bit.ly/MH9zRD
2 Stimmen
Die beste Erklärung, die ich bisher gehört habe, stammt von wikipedia: "Monaden sind programmierbare Semikolons."
0 Stimmen
Ich bin auf diesen Artikel gestoßen: stephanboyer.com/post/9/monads-part-1-a-design-pattern . Ich fand es ist die beste und effizienteste Konzeptvermittlung für Laien wie mich bisher. Der Autor hat eigentlich auch andere Artikel für Monaden.
0 Stimmen
Eine äußerst leicht verständliche Erklärung von Douglas Crockford: youtube.com/watch?v=dkZFtimgAcM
0 Stimmen
Monade ist kein Haskell-spezifisches Konzept, @HelderPereira. Ihr Retag scheint mir falsch zu sein.
1 Stimmen
@Palec Ich weiß, aber in der Frage wird Haskell erwähnt, und die am häufigsten gewählte Antwort verwendet Haskell, um sie zu erklären. Ich dachte nur, es wäre nützlich, um es für Leute, die Haskell lernen, einfacher zu machen, es zu finden, da dies ein sehr wichtiges Konzept der Sprache ist. Es steht Ihnen jedoch frei, es zu entfernen, wenn Sie denken, dass es keinen Sinn macht.
0 Stimmen
Ich möchte sagen, dass Monade ist eine Konstruktion, die Sie alle Ihre Mist in (tun tatsächlichen Job, aka Nebenwirkungen), und präsentieren Sie eine schicke Box, um Ihren Code functionnal (lesen Sie Nebeneffekt frei).
0 Stimmen
Monad ist EDSL. Siehe este : "Irgendwann bemerkte jemand: "Oh, um unreine Effekte aus reinem Code zu erhalten, muss ich Metaprogrammierung betreiben, was bedeutet, dass einer meiner Typen 'Programme, die ein X berechnen' sein muss. Ich möchte ein 'Programm, das ein X berechnet' und eine Funktion, die ein X nimmt und das nächste Programm erzeugt, ein 'Programm, das ein Y berechnet', nehmen und sie irgendwie zu einem 'Programm, das ein Y berechnet' zusammenfügen" (das ist die Bindungsoperation). Die IO-Monade war geboren."
0 Stimmen
Dieser Artikel von Tomasz Nurkiewicz ist die beste Erklärung, die ich für Java-Entwickler gefunden habe.
0 Stimmen
Kürzer: Monade ist (eingebettetes) Interpreter-Muster (wobei Anweisungen der zu interpretierenden Sprache erstklassige Werte unserer Programmiersprache selbst sind).
0 Stimmen
Monaden sind eingebettete domänenspezifische Sprachen, die Anweisungen (Semikolons) enthalten. Die Semikolons können Anweisungen in traditionellen prozeduralen Sprachen, Joins in SQL oder was immer Sie wollen darstellen. Da man Monaden zusammenführen kann, um Sprachen mit einer reicheren Semantik zu bilden, oder Monaden aufteilen kann, kann man Monaden auch als die SEMANTIK der Sprachen selbst betrachten.
2 Stimmen
Leider ist eine Monade eine Sache, die nur von Leuten erklärt werden kann, die nicht wissen, wie man etwas erklärt.