從整個檔案中讀取單詞

在 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 做到這一點。