¿Cómo puedo salir de un bucle en Haskell?
losVersión actual del tutorial de Pipes., usa las siguientes dos funciones en uno de los ejemplos:
stdout :: () -> Consumer String IO r
stdout () = forever $ do
str <- request ()
lift $ putStrLn str
stdin :: () -> Producer String IO ()
stdin () = loop
where
loop = do
eof <- lift $ IO.hIsEOF IO.stdin
unless eof $ do
str <- lift getLine
respond str
loop
Como se menciona en el tutorial, P.stdin es un poco más complicado debido a la necesidad de verificar el final de la entrada.
¿Hay alguna forma agradable de volver a escribir P.stdin para no necesitar un bucle recursivo de cola manual y utilizar combinadores de flujo de control de orden superior como hace P.stdout? En un lenguaje imperativo usaría un bucle estructurado while o una instrucción break para hacer lo mismo:
while(not IO.isEOF(IO.stdin) ){
str <- getLine()
respond(str)
}
forever(){
if(IO.isEOF(IO.stdin) ){ break }
str <- getLine()
respond(str)
}