2009-05-15 8 views
21

Lassen Sie mich im Voraus sagen, dass ich ein infantiles Verständnis von Monaden habe. Ich habe die verschiedenen Threads auf Monaden hier gelesen und habe ein paar Stunden damit verbracht, das Konzept zu studieren. Ich fühle mich kaum wohl mit dem Begriff, aber ich denke, es ist sicher zu sagen, dass ich allgemein verstehen, was eine Monade ist/tut.Was ist das überzeugende Szenario für die Verwendung von Monaden in C#

Ich bin ein C# -Entwickler, der meine Arbeitsweise verbessern möchte. Was mir weiter in meiner Monaducation helfen würde, ist eine echte Weltanwendung einer Monade in C# (d. H. Über eine linq SelectMany() oder eine solche), die eindeutig eine Verbesserung gegenüber anderen Möglichkeiten zur Lösung der gleichen Art von Problem in oldskool C# darstellt.

Hat jemand so ein Biest gesehen?

+0

Abgesehen davon, eine interessante Frage, mochte ich den Begriff "Monaducation". –

+1

Ich fange an, John Skeet/Tomas Petreceks ** Real World Functional Programming ** http://www.amazon.com/Real-World-Functional-Programming-Examples/dp/1933988924/ref=sr_1_1?ie= zu lesen UTF8 & s = Bücher & qid = 1264373395 & sr = 8-1, die aus diesem Grund kommen. –

+1

das reaktive Framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) ist ein gutes Beispiel, es scheint mir. –

Antwort

11

Hier ist ein solches Szenario: Sie möchten eine Parsing-Bibliothek (ein schönes Beispiel für eine eingebettete DSL) zu erstellen, und Sie entdecken, dass die besten sind monadische Parser-Kombinator-Bibliotheken. Sie schreiben also, dass Sie LINQ-Syntaxzucker zum Erstellen von C# -Code verwenden, der die gleiche Struktur wie die Grammatik der zu analysierenden Sprache aufweist, und Sie erhalten die Vorteile eines großartigen Programmiermodells für die semantische Analyse und Fehlerbeseitigung on-the-fly . Eine Beschreibung finden Sie unter this blog.

+0

+1: Ich beginne die pseudo-flüssige Seite des monadischen Stils zu verstehen. Das hilft. Ich fange an zu erreichen, dass Monaden mehrere komplementäre Ziele erreichen, von denen eine erhöhte Lesbarkeit –

4

Hier ist ein solches Szenario: Sie möchten Code schreiben, der sequenzielle asynchrone Aufrufe (z. B. IO) macht, ohne Threads zu halten, aber Sie möchten nicht das hoffnungslose Gewirr von Spaghetti schreiben, die das asynchrone Programmiermodell (BeginFoo/EndFoo) zwingt dich dazu. So können Sie eine Monade und LINQ-Zucker verwenden und Code schreiben, der gerade aussieht, aber es gibt ganze Threads frei. Eine kurze Beschreibung finden Sie unter this blog.

0

LINQ wird in vielen Lösungen (und oft in Fragen gefragt) hier auf StackOverflow verwendet. Überprüfen Sie die Fragen mit dem Tag LINQ, und Sie werden die reale Welt sehen.

+0

ist, während es stimmt, dass LINQ monadisch ist, gibt es signifikante Unterschiede zwischen LINQ und sagen, eine IO() Monade in Haskell, die die Monadenutzung machen in C# nicht sauber und vielleicht nicht wirklich das beste Beispiel für eine Monade ...? Vielleicht bin ich nur verwirrt über die Unterschiede zwischen monadischen Prinzipien in einer reinen vs. inpure Sprache? –

3
+0

@all: Dies wurde als Spam markiert; aber eigentlich ist dieser Link * monad-bezogen. Ein bestimmter Beitrag wäre vielleicht besser gewesen, aber OT ist es nicht. –

+0

Ich erhalte dieses C# -Beispiel nicht vollständig, wenn ich einen Monad-Ansatz verwende, aber es ist interessanter Code in dem Beispiel. Etwas zum Nachdenken. –

0

Programmierung mit Monaden ist deklarative, die beschreiben, was Sie auf einem hohen Niveau wollen, anstatt die Low-Level-Details, wie es zu erzeugen.

Siehe exercises at the end von Brian Beckman's state-monad talk on Channel 9.

+0

danke. das war hilfreich, aber nicht im Widerspruch zu dem, was Beckman sagt, nicht so großartig eine Erklärung (oder zumindest war es nicht so hilfreich für mich). –

5

Finden Pythagoreische Tripel:

var r = from a in Enumerable.Range(1, 25) 
      from b in Enumerable.Range(a, 25-a) 
      from c in Enumerable.Range(b, 25-b) 
      where a*a + b*b == c*c 
      select new [] { a, b, c }; 
+0

nett. Ich fange an, die Beziehung zwischen Monaden und dem funktionalen Stil allgemein zu sehen. Dieses Beispiel ist eine gute Illustration von beiden. –

0

I recently blogged über eine typische Imperativ realen C# -Code Refactoring (eine Funktion in NuGet) funktionellen, monadischen Stil (genauer gesagt mit der Vielleicht Monade). Ich habe mein Bestes getan, um es in kleinen Schritten zu tun und den rationalen Schritt zu erklären. Ich denke, es hilft zu verstehen, wie Monaden nützlich sind.

3

Ein Beispiel ist die Vereinfachung null prüft mit der Maybe-Monade wie in this article gezeigt.