在Haskell中同时读取和写入同一文件时出错

时间:2012-10-27 05:29:21

标签: haskell file-io locking lazy-evaluation lazy-io

我需要就地修改文件。所以我计划读取文件内容,处理它们,然后将输出写入同一个文件:

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)

有没有办法强制读取该文件?

1 个答案:

答案 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版本。

懒惰IO

您遇到的问题是Haskell的一些IO功能使用“Lazy IO”,它具有令人惊讶的语义。在几乎每个程序中,我都会避免懒惰的IO。

现在,人们正在寻找像管道之类的懒惰IO的替代品,懒惰的IO被视为一个丑陋的黑客,不幸的是它被困在标准库中。