Il current version of the Pipes tutorial, utilizza le seguenti due funzioni in uno degli esempi:Come faccio a uscire da un loop in Haskell?
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
Come mentinoed nel tutorial sé, P.stdin è un po 'più complicato a causa della necessità per verificare la fine dell'input .
Ci sono dei buoni modi per riscrivere P.stdin per non aver bisogno di un ciclo ricorsivo di coda manuale e utilizzare combinatori di flusso di controllo di ordine superiore come fa P.stdout? In un linguaggio imperativo userei un strutturata ciclo while o un'istruzione break per fare la stessa cosa:
while(not IO.isEOF(IO.stdin)){
str <- getLine()
respond(str)
}
forever(){
if(IO.isEOF(IO.stdin)){ break }
str <- getLine()
respond(str)
}
'whileM_' sembra fare la stessa cosa ma con i parametri nell'ordine" solito ". Questo è esattamente quello che stavo cercando. – hugomg
In un certo senso, l'ordine degli argomenti 'whileM_' è più naturale. Tuttavia, ciò richiede l'inversione del test, ho pensato "fare qualcosa fino a EOF" è più naturale di "while (non EOF) fare qualcosa". Preferenza personale. –
Mi sono anche accorto che fino a quando _ controlla la condizione dopo il corpo del ciclo. Questo avrebbe un comportamento diverso rispetto al codice orifinale. – hugomg