L'equivalente di Haskell per l'iterazione è la ricorsione. Dovresti anche lavorare nella monade IO
, se devi leggere le righe di input. Il quadro generale è:
import Control.Monad
main = do
line <- getLine
unless (line == "q") $ do
-- process line
main
Se si desidera solo per accumulare tutte le linee di lettura in content
, non c'è bisogno di farlo. Basta usare getContents
che recupererà (pigramente) tutti gli input dell'utente. Basta fermarsi quando vedi lo 'q'
. In tutto idiomatica Haskell, tutti la lettura potrebbe essere fatto in una sola riga di codice:
main = mapM_ process . takeWhile (/= "q") . lines =<< getContents
where process line = do -- whatever you like, e.g.
putStrLn line
Se avete letto la prima riga di codice da destra a sinistra, si dice:
get tutto ciò che l'utente fornirà come input (mai paura, questo è pigro);
dividerlo in linee come viene;
prendere linee solo se non sono uguali a "q", fermarsi quando si vede una tale linea;
e chiamare process
per ogni riga.
Se non l'hai già capito, devi leggere attentamente un tutorial di Haskell!
Ora, lo scriverebbe davvero in Haskell? Aggiungendo 'line' a' contents' ogni volta si ottiene una prestazione scadente. Il 'contenuto' che vuoi alla fine è un prefisso di ciò che una singola chiamata a' getContents' ti darà. – nickie
Questo è un punto giusto - ma ho pensato che valesse la pena spiegare come fare questo "da zero", per avere un'idea di come lavorare nella monade IO (che è probabilmente la parte più confusa di Haskell per i nuovi arrivati). Ha anche il vantaggio di separare l'input dell'utente dall'elaborazione da eseguire nell'input, che la tua risposta non ha. Aggiungerò un'appendice su 'getContents'. –
OK, punto preso, sto riprendendo il mio iniziale -1. Ma, a parte gli scopi educativi, considererei il codice come questo cattivo Haskell. Per le persone a cui importa, almeno ... :-) – nickie