从整个文件中读取单词

在 Haskell 中,通常根本不打扰文件句柄,而只是直接从磁盘读取或写入整个文件到内存 ,并使用纯字符串数据结构对文本进行所有分区/处理。这避免了混合 IO 和程序逻辑,这可以极大地帮助避免错误。

-- | 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

如果 loremipsum.txt 包含

Lorem ipsum dolor sit amet,
consectetur adipiscing elit

然后程序将输出

elit
adipiscing
consectetur
amet,
sit
dolor
ipsum
Lorem

在这里, mapM_ 浏览了文件中所有单词的列表,并用 putStrLn 将它们打印到一个单独的行。

如果你认为这对记忆是浪费的,那么你有一个观点。实际上,Haskell 的懒惰通常可以避免整个文件需要同时驻留在内存中…但要注意,这种懒惰的 IO 会导致其自身的一系列问题。对于性能关键型应用程序,严格执行要立即读取的整个文件通常是有意义的; 你可以用 Data.Text 版本的 readFile 做到这一点。