¿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)
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta