從整個檔案中讀取單詞
在 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
做到這一點。