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 g
nil
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.
Soweit ich verstehe, sind Scheme-Streams Lazy-Werte, während Monads benutzerdefinierte Verkettung von Berechnungen sind. – Salil
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
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