1694 Stimmen

Was ist eine Monade?

Nachdem ich mich kürzlich kurz mit Haskell beschäftigt habe, was wäre ein kurz, prägnant, praktisch eine Erklärung, was eine Monade im Wesentlichen ist?

Die meisten Erklärungen, auf die ich gestoßen bin, waren ziemlich unzugänglich und enthielten keine praktischen Details.

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

9voto

jes5199 Punkte 17223

In letzter Zeit habe ich über Monaden auf eine andere Art und Weise nachgedacht. Ich betrachte sie als Abstraktion von Ausführungsanordnung in einer mathematischen Weise, die neue Arten von Polymorphismus ermöglicht.

Wenn Sie eine imperative Sprache verwenden und einige Ausdrücke in der richtigen Reihenfolge schreiben, wird der Code IMMER genau in dieser Reihenfolge ausgeführt.

Und im einfachen Fall, wenn Sie eine Monade verwenden, fühlt es sich genauso an - Sie definieren eine Liste von Ausdrücken, die in der Reihenfolge passieren. Je nachdem, welche Monade Sie verwenden, könnte Ihr Code jedoch der Reihe nach ablaufen (wie in der IO-Monade), parallel über mehrere Elemente auf einmal (wie in der Listen-Monade), er könnte auf halbem Weg anhalten (wie in der Maybe-Monade), er könnte auf halbem Weg pausieren, um später wieder aufgenommen zu werden (wie in einer Resumption-Monade), er könnte zurückspulen und von vorne beginnen (wie in einer Transaktions-Monade), oder er könnte auf halbem Weg zurückspulen, um andere Optionen auszuprobieren (wie in einer Logik-Monade).

Und da Monaden polymorph sind, ist es möglich, denselben Code in verschiedenen Monaden auszuführen, je nach Bedarf.

Außerdem ist es in einigen Fällen möglich, Monaden miteinander zu kombinieren (mit Monadentransformatoren), um mehrere Funktionen gleichzeitig zu erhalten.

8voto

thSoft Punkte 20471

Monaden sind keine Metaphern sondern eine praktisch nützliche Abstraktion, die sich aus einem gemeinsamen Muster ergibt, wie Daniel Spiewak erklärt.

7voto

Alex Punkte 1521

Eine Monade ist eine Möglichkeit, Berechnungen zu kombinieren, die einen gemeinsamen Kontext haben. Es ist wie der Aufbau eines Netzes von Leitungen. Wenn ich das Netzwerk aufbaue, fließen keine Daten durch. Aber wenn ich alle Bits mit 'bind' und 'return' zusammengefügt habe, rufe ich etwas auf wie runMyMonad monad data und die Daten fließen durch die Leitungen.

1 Stimmen

Das ist eher ein Applicative als ein Monad. Bei Monaden müssen Sie erst Daten aus den Pipes abrufen, bevor Sie die nächste Pipe zum Verbinden auswählen können.

0 Stimmen

Ja, Sie beschreiben den Applicative, nicht die Monade. Die Monade baut das nächste Rohrsegment an Ort und Stelle auf, abhängig von den Daten, die diesen Punkt innerhalb des Rohrs erreicht haben.

7voto

In der Praxis ist die Monade eine benutzerdefinierte Implementierung des Funktionskompositionsoperators, der sich um Seiteneffekte und inkompatible Eingabe- und Rückgabewerte (für die Verkettung) kümmert.

7voto

Zusätzlich zu den ausgezeichneten Antworten oben, möchte ich Ihnen einen Link zu folgendem Artikel (von Patrick Thomson) anbieten, der Monaden erklärt, indem er das Konzept auf die JavaScript-Bibliothek bezieht jQuery (und seine Art der "Methodenverkettung", um das DOM zu manipulieren): jQuery ist eine Monade

El jQuery-Dokumentation selbst verweist nicht auf den Begriff "Monade", sondern spricht vom "Builder-Muster", das wahrscheinlich vertrauter ist. Das ändert nichts an der Tatsache, dass Sie dort eine richtige Monade haben, vielleicht sogar ohne es zu merken.

0 Stimmen

Wenn Sie jQuery verwenden, kann diese Erklärung sehr hilfreich sein, vor allem, wenn Ihre Haskell-Kenntnisse nicht stark sind

11 Stimmen

JQuery ist ausdrücklich keine Monade. Der verlinkte Artikel ist falsch.

2 Stimmen

Nachdrücklich" zu sein, ist nicht sehr überzeugend. Eine nützliche Diskussion zu diesem Thema finden Sie unter Ist jQuery eine Monade - Stack Overflow

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X