5

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

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)

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

4

1 回答 1

5

最简单的可能是严格的ByteStringIO:

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。

这些天来,人们正在寻找像 Conduit 之类的惰性 IO 的替代品,而惰性 IO 被视为一种丑陋的 hack,不幸的是它被困在标准库中。

于 2012-10-27T05:33:35.200 回答