Haskell Language Leggere le parole da un intero file


Esempio

In Haskell, ha spesso senso non preoccuparsi affatto degli handle di file , ma semplicemente leggere o scrivere un intero file direttamente dal disco alla memoria e fare tutto il partizionamento / elaborazione del testo con la struttura dei dati della stringa pura. Questo evita di mescolare la logica di IO e del programma, che può essere di grande aiuto nell'evitare bug.

-- | The interesting part of the program, which actually processes data
--   but doesn't do any IO!
reverseWords :: String -> [String]
reverseWords = reverse . words

-- | A simple wrapper that only fetches the data from disk, lets
--   'reverseWords' do its job, and puts the result to stdout.
main :: IO ()
main = do
   content <- readFile "loremipsum.txt"
   mapM_ putStrLn $ reverseWords content

Se contiene loremipsum.txt

Lorem ipsum dolor sit amet,
consectetur adipiscing elit

allora il programma uscirà

elit
adipiscing
consectetur
amet,
sit
dolor
ipsum
Lorem

Qui, mapM_ ha mapM_ l'elenco di tutte le parole nel file e le ha stampate su una riga separata con putStrLn .


Se pensi che questo sia uno spreco nella memoria, hai un punto. In realtà, la pigrizia di Haskell può spesso evitare che l'intero file abbia bisogno di risiedere nella memoria simultaneamente ... ma attenzione, questo tipo di IO pigro causa il proprio insieme di problemi. Per le applicazioni critiche per le prestazioni, ha spesso senso imporre l'intero file da leggere contemporaneamente; si può fare questo con la Data.Text versione di readFile .