Bucle infinito en fuente con conducto

Decidí intentar manejar el conducto y pensé que lo estaba haciendo bien, pero cuando intento hacer esta fuente simple con el conducto 4, obtengo un bucle infinito y no entiendo por qué. Esto está simplificado, la versión original crearía un nombre de archivo temporal y lo devolvería a través de yield. Esto solo devuelve un ().

import Control.Monad.IO.Class

import Data.Conduit
import Data.Conduit.List as CL

tempfiles :: MonadIO m => Source m ()
tempfiles = loop
  where
    loop = do
      x <- liftIO $ print "tempfile"
      yield x
      loop

Si corro:

runResourceT $ (tempfiles $$ CL.take 5)

Obtengo un bucle infinito. ¿Por qué no se ejecuta cinco veces y me da una lista de cinco ()s?

preguntado el 04 de julio de 12 a las 06:07

Pequeño detalle: por qué tempfiles = loop where loop = do ... loop ? Porque no solo tempfiles = do ... tempfiles? -

Debido a que la función mkstemp en System.Posix.Temp requiere un argumento, por lo que tempfiles en sí mismo necesitaba uno, pero dado que estoy recursando y ese argumento no cambia, en lugar de pasarlo nuevamente, simplemente hice una función de bucle para hacer recurse con el cual reutiliza continuamente el argumento pasado en el nivel superior. -

El resultado final fue este: gist.github.com/3051620 Lo cual es condenadamente genial, sinceramente. Un generador infinito de archivos temporales perezosos, esencialmente. Esta biblioteca es divertida. -

1 Respuestas

En el conducto 0.4, el rendimiento no realiza la terminación automática. Este es un cambio importante en la versión 0.5; su código funciona como se esperaba allí.

Respondido 04 Jul 12, 07:07

Bueno, estaba esperando http-conduit, pero supongo que es razón suficiente para actualizar ahora. Gracias. - David McHealy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.