Como Salil ya se ha dicho, los dos son diferentes conceptos:
A corriente es una lista (potencialmente infinito) de valores, típicamente, pero no necesariamente, calcularse de manera perezosa, es decir, sólo el almacenamiento de alguna manera de calcular los valores cuando se solicita. Hay un montón de ejemplos en que no implican mónadas en modo alguno:
(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))
Es muy útil tener en cuenta también finitos, precalculados, listas como arroyos, ya que se puede utilizar en cualquier lugar de una (potencial o necesariamente) finita lazy stream podría ser utilizada.
Por lo tanto, una secuencia es algo que tiene una operación next: streamType -> (valueType streamType)
para obtener el siguiente valor y la secuencia restante.
mónadas, por el contrario, son menos de una estructura de datos y más una forma de escribir código fuente mediante la combinación de los comandos individuales.
Probablemente el ejemplo más simple útil es la “mónada Maybe” - No estoy seguro de lo que se vería en el esquema, lo siento, pero la idea es: Dada una lista de cálculos (f g h)
y una entrada x
, llevar a cabo la cálculos en orden, casi como si se hubiera dado (f (g (h x)))
, pero deje que cada función falle correctamente: si g
devuelve , no invoque (f nil)
, sino que en su lugar, devuelva nil
inmediatamente.
Puede, por supuesto, combinar los dos en varias formas útiles y calcular sus valores de las muestras con las mónadas o encapsular el uso de corrientes como los arroyos E/S que no están siguiendo exactamente las expectativas de la programación funcional en una mónada (para evitar que el código guarde una referencia a algún estado previo de la transmisión), pero tienen fines completamente diferentes. Piense en la capa de abstracción (cierre la tapa, no mire las entrañas): una mónada, aplicada a funciones, le da una función. Una secuencia, por otro lado, no es una función más alta, sino una lista de valores.
Obviamente, la función definida por (o devuelta desde, dependiendo de su punto de vista) la mónada puede ser una implementación de una secuencia, y también, los valores extraídos de una secuencia pueden ser mónadas. Pero como puede ver arriba, hay mónadas que implementan cosas completamente diferentes de las transmisiones. Si hay streams no implementados como mónadas, probablemente dependa de exactamente para qué uses exactamente el término. Debo confesar que no estoy seguro en este momento si los flujos infinitos califican adecuadamente como mónadas; listas finitas obviamente lo hacen.
Por lo que yo entiendo, las transmisiones de Scheme son valores vagos, mientras que las mónadas son cadenas personalizadas de cálculos. – Salil
Las secuencias son exactamente listas perezosas. ¿Cómo se pueden presentar los "valores perezosos" sin mónadas o listas perezosas o algo así? No confunda los "valores perezosos" con las variables funcionales inmutables. Bien, ¿y el "encadenamiento personalizado de cómputos" tiene correspondencia uno a uno con "incluso transmisiones"? – cofp
Bueno. Compare las definiciones de "incluso flujos" y mónadas. Y también sus axiomas. Como sé, cada flujo se puede expresar a través de una mónada. ¿Es cierto lo que cada "valor" o "cálculo" monádico se puede expresar a través de un "flujo par"? ¿Hay alguna limitación? – cofp