2012-05-07 5 views
13

Gibt es einen Unterschied zwischen Streams (faulen Listen) und Monaden? Aus konzeptionellen und mathematischen Gesichtspunkten, nicht aus technischer Umsetzung.Streams vs Monaden

Oder gibt es sonst biunique, eins-zu-eins-Korrespondenz zwischen?

Genauer gesagt, als Streams bedeutet es "even streams" aus der SRFI-41 der Scheme-Sprache.

Ist es eine andere Kategorie als Monaden? Wenn ja, welche Kategorie ist das?

Können "even streams" die Kontrolle von Nebenwirkungen garantieren, wie Monaden?

+0

Soweit ich verstehe, sind Scheme-Streams Lazy-Werte, während Monads benutzerdefinierte Verkettung von Berechnungen sind. – Salil

+0

Streams sind genau faule Listen. Wie können "faule Werte" ohne Monaden oder wieder faule Listen oder ähnliches dargestellt werden? Verwechseln Sie nicht "faule Werte" mit unveränderlichen funktionalen Variablen. Nun, und hat die "benutzerdefinierte Verkettung von Berechnungen" eine eins-zu-eins Entsprechung mit "even streams"? – cofp

+0

Gut. Vergleichen Sie die Definitionen von "even streams" und "monads". Und auch ihre Axiome. Wie ich weiß, kann jeder Stream über eine Monade ausgedrückt werden. Ist es wahr, was jeder monadische "Wert" oder "Berechnung" durch einen "geraden Strom" ausgedrückt werden kann? Gibt es irgendwelche Einschränkungen? – cofp

Antwort

5

Wie Salil bereits gesagt, sind die zwei unterschiedliche Konzepte:

A Strom ist eine (möglicherweise unendliche) Liste von Werten, in der Regel, aber nicht notwendigerweise, in lazy Weise berechnet, das heißt, nur einen Weg zu speichern Berechnen der Werte bei Anforderung. Es gibt viele Beispiele rund um das nicht Monaden in irgendeiner Weise beteiligt: ​​

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers)) 

Es ist durchaus sinnvoll, auch endlich, vorberechneten, Listen als Streams zu betrachten, da man sie überall ein (potenziell oder unbedingt) endlich nutzen können Lazy Stream könnte verwendet werden.

Also, ein Stream ist etwas, das eine Operation next: streamType -> (valueType streamType) hat, um den nächsten Wert und den verbleibenden Stream zu erhalten.

 

Monads, auf der anderen Seite, sind weniger von einer Datenstruktur und einer Weg-Quellcode des Schreibens von einzelnen Befehlen kombiniert wird.

Wahrscheinlich das einfachste nützliche Beispiel ist die "Vielleicht Monade" - Ich bin mir nicht sicher, wie es in Scheme aussehen würde, aber die Idee ist: Gegeben eine Liste von Berechnungen (f g h) und einen Eingang x, führen Sie die Berechnungen in der Reihenfolge, fast so, als ob (f (g (h x))) gegeben, aber lassen Sie jede Funktion ordnungsgemäß fehlschlagen: Wenn gnil zurückgibt, rufen Sie nicht (f nil) auf, aber stattdessen nil sofort zurückgeben.

 

Sie können, natürlich, kombinieren die beiden in verschiedenen nützlichen Möglichkeiten und Ihren Stream Werte mit Monaden berechnen oder die Verwendung von Strömen wie I/O-Streams kapseln, die nicht genau die Erwartungen der funktionalen Programmierung folgen in einer Monade (um Code zu vermeiden, der eine Referenz auf einen vorherigen Zustand des Stroms speichert), aber sie dienen völlig anderen Zwecken. Denken Sie an die Abstraktionsschicht (schließen Sie das Cover, schauen Sie nicht auf die Innereien): Eine Monade, die auf Funktionen angewendet wird, gibt Ihnen eine Funktion. Ein Stream hingegen ist keine höhere Funktion, sondern eine Werteliste.

Offensichtlich kann die Funktion, die von (abhängig von Ihrem Standpunkt) definiert (oder zurückgegeben von), die Monade eine Implementierung eines Streams sein, und auch die aus einem Stream extrahierten Werte können Monaden sein. Aber wie Sie oben sehen können, gibt es Monaden, die Dinge komplett anders als Streams implementieren. Ob es Streams gibt, die nicht als Monaden implementiert sind, hängt wahrscheinlich davon ab, wofür genau Sie den Begriff verwenden. Ich muss gestehen, ich bin mir im Moment nicht sicher, ob sich unendliche Ströme als Monaden qualifizieren; endliche Listen machen es offensichtlich.

+0

Ihre Antwort ist viel nützlicher. Und Einwände gegen die vorherige Antwort waren gegen keinen Unterschied. Es ging nur darum, den Unterschied zu finden. Aber Einwände gegen vorherige Antwort waren gegen die Gleichung von "faulen Werten" mit Schemes Versprechen. Und gegen etwas anderes, aber nicht gegen irgendeinen Unterschied. – cofp

+0

Nun, gerade im Text der Frage war der Vorschlag, nicht "unter die Decke zu schauen". Also, was ist der Unterschied zwischen einer "Datenstruktur" und einem "Weg", etwas zu tun ("Code schreiben")? Aus der Sicht der Abstraktion von Zeit und Staaten. Zu sagen, dass etwas mehr oder weniger eine "Datenstruktur" ist. Und sind "faule Listen" Strukturen oder nur ein "Weg"? Denn die Aussage "Streams sind genau faule Listen" war nur ein Einwand gegen "faule Werte". Daraus folgt nicht, dass dieser Stream genau "Datenstrukturen" sind. – cofp

+0

Ihre Überlegungen über eine "höhere Funktion" sind stärker IMHO. Obwohl es immer noch einen Beweis braucht, dass es keine Möglichkeit gibt, "even streams" als höhere Funktionen zu verwenden. Es wäre also bewiesen, dass Streams restriktiver sind als Modads. Aber um zu sagen, dass sie * komplett * anders sind, vergiss nicht, dass Streams über Monaden ausgedrückt werden können. Streams sind also nur eine Unterkategorie von Monaden. Aber ist diese Unterkategorie streng "sub"? Oder ist es nur eine teilweise Kreuzung? IMHO ist die Frage offen. – cofp