我需要就地修改文件。所以我计划读取文件内容,处理它们,然后将输出写入同一个文件:
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)
有没有办法强制读取该文件?
答案 0 :(得分:5)
最简单的事情可能是严格的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被视为一个丑陋的黑客,不幸的是它被困在标准库中。