2012-05-07 20 views
13

¿Existe alguna diferencia entre las secuencias (listas diferidas) y las mónadas? Desde puntos de vista conceptuales y matemáticos, no desde la implementación técnica.Corrientes vs mónadas

¿O sí, existe biunique, correspondencia uno-a-uno entre?

Más exactamente, como secuencias significa "incluso transmisiones" desde el SRFI-41 del lenguaje Scheme.

¿Es otra categoría que las mónadas? Si es así, ¿qué categoría es?

¿Puede "incluso transmisiones" garantizar el control de los efectos secundarios, como las mónadas?

+0

Por lo que yo entiendo, las transmisiones de Scheme son valores vagos, mientras que las mónadas son cadenas personalizadas de cálculos. – Salil

+0

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

+0

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

Respuesta

5

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.

+0

Tu respuesta es mucho más útil. Y las objeciones a la respuesta previa no estaban en contra de ninguna diferencia. Solo era cuestión de la cuestión encontrar la diferencia. Pero las objeciones a la respuesta previa estaban en contra de la ecuación de "valores perezosos" con las promesas de Scheme. Y contra algo más, pero no en contra de ninguna diferencia. – cofp

+0

Bueno, solo en el texto de la pregunta estaba la sugerencia de no mirar "debajo de la tapa". Entonces, ¿cuál es la diferencia entre una "estructura de datos" y una "forma de" hacer algo ("escribir código")? Desde el punto de vista de la abstracción desde el tiempo y los estados. Decir que algo es más o menos una "estructura de datos". ¿Y son estructuras de "listas perezosas" o simplemente una "forma"? Porque la afirmación de que "las transmisiones son exactamente listas perezosas" fue solo una objeción a los "valores perezosos". De esto no se sigue que la secuencia sea exactamente "estructuras de datos". – cofp

+0

Sus razonamientos sobre una "función superior" son más fuertes en mi humilde opinión. Aunque todavía necesita una prueba de que no hay ninguna forma de usar "incluso transmisiones" como funciones superiores. Por lo tanto, se probaría que los flujos son más restrictivos que los modads. Pero para decir que son * completamente * diferentes, no olvide que los flujos se pueden expresar a través de mónadas. Entonces las transmisiones son solo una subcategoría de mónadas. ¿Pero esta subcategoría es un "sub" estricto? ¿O es solo una intersección parcial? En mi humilde opinión, la pregunta está abierta. – cofp