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関数のいくつかが「レイジーIO」を使用していることです。これは驚くべきセマンティクスを持っています。ほとんどすべてのプログラムで、私は怠惰なIOを避けます。

最近、人々はコンジットなどのようなレイジーIOの代替品を探しています。レイジーIOは、残念ながら標準ライブラリに残っている醜いハックと見なされています。

于 2012-10-27T05:33:35.200 に答える