[英]Error reading and writing same file simultaneously in Haskell
我需要就地修改文件。 所以我打算讀取文件內容,處理它們,然后將輸出寫入同一個文件:
main = do
input <- readFile "file.txt"
let output = (map toUpper input)
-- putStrLn $ show $ length output
writeFile "file.txt" output
但問題是,只有當我取消注釋第4行時才會按預期工作 - 我只是輸出字符數到控制台。 如果我不取消注釋,我會得到
openFile: resource busy (file is locked)
有沒有辦法強制閱讀該文件?
最簡單的事情可能是嚴格的ByteString
IO:
import qualified Data.ByteString.Char8 as B
main = do
input <- B.readFile "file.txt"
B.writeFile "file.txt" $ B.map toUpper input
正如您所看到的,它是相同的代碼 - 但是一些函數被ByteString
版本替換。
您遇到的問題是Haskell的一些IO函數使用“Lazy IO”,它具有令人驚訝的語義。 在幾乎每個程序中,我都會避免懶惰的IO。
現在,人們正在尋找像管道之類的懶惰IO的替代品,懶惰的IO被視為丑陋的黑客,遺憾的是它被困在標准庫中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.