Ist der Berechnungsausdruck derselbe wie die Monade?

22

Ich lerne immer noch funktionale Programmierung (mit f #) und habe kürzlich angefangen, über Rechenausdrücke zu lesen. Ich verstehe das Konzept immer noch nicht ganz und eine Sache, die mich unsicher macht, wenn ich alle Artikel über Monaden lese (die meisten basieren auf Haskell), ist die Beziehung zwischen Rechenausdrücken und Monaden.

Nachdem ich das alles geschrieben habe, ist hier meine Frage (eigentlich zwei Fragen):

Ist jeder F # -Berechnungsausdruck eine Monade? Kann jede Monade mit einem F # -Berechnungsausdruck ausgedrückt werden?

Ich habe diesen Beitrag von Tomas Petricek gelesen und wenn ich ihn gut verstehe, heißt es, dass Rechenausdrücke mehr als Monaden sind, aber ich bin mir nicht sicher, ob ich das richtig interpretiere.

Grzegorz Sławecki
quelle
@Raphael Darf ich fragen, warum das lang-Tag entfernt wurde?
Grzegorz Sławecki
2
Da uns Konzepte am Herzen liegen, versuchen wir, die meisten Dinge hier sprachunabhängig zu halten. Ich weiß nicht, was das Entfernen von F # für die Frage bedeutet ( ich denke, wenn es wichtig ist, dass es F # ist, ist die Frage hier offtopisch, aber es ist ein Grenzfall), also entferne ich nur das F # -Tag. Faustregel: F # ist kein CS-Konzept, daher wird kein Tag benötigt. (Ja, ich kenne andere PL-Tags und ich mag sie auch nicht. Bei einigen Fragen hat die Community entschieden, dass sie diese Tags garantieren.)
Raphael
1
@ Raffael Ich glaube, die Frage ist in der Tat ein Grenzfall. Jemand hat beschlossen, es hierher zu migrieren, aber es scheint, dass es auch hier ein wenig vom Thema abweicht. Die Frage selbst ist seitdem eine Art Computer, aber gleichzeitig beziehen sich sowohl die Antworten als auch die Frage speziell auf f #. Ich verstehe Ihre Faustregel, danke für die Klarstellung.
Grzegorz Sławecki

Antworten:

22

Zuallererst sind Rechenausdrücke ein Sprachmerkmal, während Monaden mathematische Abstraktionen sind, so dass sie aus dieser Sicht völlig verschiedene Dinge sind .

Aber das wäre keine sehr nützliche Antwort :-). Rechenausdrücke sind eine Sprachfunktion, mit der Sie eine Syntax erhalten, die zum Programmieren mit Berechnungen (oder Datentypen) mit monadischer Struktur, aber auch mit anderen Strukturen verwendet werden kann. Sie können mein F # -Berechnungsausdruck-Zoopapier für weitere Details lesen , aber Berechnungsausdrücke können verwendet werden mit:

  • Monaden, aber auch additive Monaden (wie Haskeller es nennen MonadPlusoder MonadOr)
  • Zusammengesetzte Berechnungen (was Haskellers Monadentransformatoren nennen)
  • Berechnungen, die monadisch sind, aber andere F # -Konstrukte wie die Ausnahmebehandlung unterstützen
  • Monoide (und einige Variationen ohne monadische Bindung)
  • Anwendbare Funktoren (obwohl dies nur in einer Forschungserweiterung implementiert ist)

Rechenausdrücke sind also sicherlich eng mit Monaden verbunden, aber nicht so eng mit ihnen. Dies steht z. B. im Gegensatz zu Haskells doNotation, die viel enger mit Monaden verknüpft ist (obwohl auch dies mit Berechnungen verwendet werden kann, die keine rein mathematischen Monaden sind).

Tomas Petricek
quelle
3
Monadentransformatoren sind eine generische Möglichkeit, eine Monade in eine andere zu konvertieren. F # -Berechnungsausdrücke unterstützen nur die direkte Implementierung des / result / dieser Transformation und nicht die eigentliche Transformation.
GS - Entschuldigen Sie sich bei Monica
1
@ GaneshSittampalam - Ja, Sie haben Recht. Mein Versuch zu vereinfachen war hier nicht allzu nützlich :-). Berechnungsausdrücke können Ihnen eine Syntax für die Arbeit mit einer Berechnung geben, die das Ergebnis der Anwendung eines Monadentransformators ist (mit möglicherweise unterschiedlicher Syntax für die zugrunde liegende Monade und für die zusammengesetzte Monade)
Tomas Petricek
5

Sie können Rechenausdrücke verwenden, um Monaden auszudrücken. Es ist ein Beispiel hier . Wie Sie bereits bemerkt haben, können Sie Berechnungsausdrücke nicht nur für Monaden verwenden. Es gibt eine ausführliche Erklärung, wie sie sich hier unterscheiden . Hier ist kein Platz, um den Unterschied richtig zu erklären, aber Rechenausdrücke unterscheiden sich von Monaden darin, dass sie die normale F # -Syntax wiederverwenden und zusätzliche Abstraktionen hinzufügen können. Eine Einschränkung besteht darin, dass es nicht idiomatisch (und schwierig) ist, einen Rechenausdruck zu schreiben, der über die Art der Berechnung polymorph ist.

N / A
quelle
1
Bitte machen Sie Ihre Antwort unabhängiger, indem Sie zumindest das Material auf den Seiten, auf die Sie verlinken, zusammenfassen. Ihre aktuelle Antwort ist völlig bedeutungslos, wenn die beiden Links nicht mehr funktionieren.
David Richerby
2
Ich bin mir nicht sicher, wovon du sprichst. Ich habe die Fragen explizit beantwortet und dann Links zu weiteren Informationen gegeben, wenn der Fragesteller interessiert ist. Die Links werden nicht benötigt, um die Frage zu beantworten.
N_A
1
Ich kann mir nicht einmal vorstellen, dass die beiden Links jemals aufhören könnten zu funktionieren :-)
Tomas Petricek