Por qué la función de secuencia de Haskell no puede ser perezosa o por qué las funciones monádicas recursivas no pueden ser perezosas

Con la preguntaLa lista de todos los contenidos de un directorio por orden de primer orden da como resultado una eficiencia bajaAprendí que la baja eficiencia se debe a un extraño comportamiento de las funciones de la mónada recursiva.

Tratar

sequence $ map return [1..]::[[Int]]
sequence $ map return [1..]::Maybe [Int]

y ghci caerá en un cálculo sin fin.

Si reescribimos la función de secuencia en una forma más legible como sigue:

sequence' []     = return []
sequence' (m:ms) = do {x<-m; xs<-sequence' ms; return (x:xs)}

y prueba:

sequence' $ map return [1..]::[[Int]]
sequence' $ map return [1..]::Maybe [Int]

Tenemos la misma situación, un bucle sin fin.

Prueba una lista finita

sequence' $ map return [1..]::Maybe [Int]

saldrá el resultado esperadoJust [1,2,3,4..] después de un largo tiempo de espera.

De lo que intentamos, podemos llegar a la conclusión de que aunque la definición de secuencia "parece ser perezosa, es estricta y tiene que distinguir todos los números antes de poder imprimir el resultado de la secuencia".

No solo la secuencia ', si definimos una función

iterateM:: Monad m => (a -> m a) -> a -> m [a]
iterateM f x = (f x) >>= iterateM0 f >>= return.(x:)

y prueba

iterateM (>>=(+1)) 0

entonces ocurre un cálculo interminable.

Como todos sabemos, la iteración no monádica se define como la iteración M anterior, pero la razón por la que la iteración es perezosa y la iteración M es estricta. Como podemos ver desde arriba, tanto iterarM como la secuencia son funciones monádicas recursivas. Hay algo extraño con las funciones monádicas recursivas

Respuestas a la pregunta(3)

Su respuesta a la pregunta