Ошибка «ресурс занят (файл заблокирован)» в Haskell

Я новичок в Haskell. Фактически, я прорабатываю этот раздел этого руководства. Я наткнулся на этот фрагмент кода:

import System.IO     
import Data.Char  

main = do     
    contents <- readFile "girlfriend.txt"     
    writeFile "girlfriendcaps.txt" (map toUpper contents) 

, который читает содержимое файла с именем «girlfriend.txt» и записывает версию файла в верхнем регистре в новый файл с именем «girlfriendcaps.txt».

Итак, Я хотел немного изменить код, чтобы использовать имя файла, чтобы действовать. Я изменил код на этот:

import System.IO
import Data.Char

main = do
    path <- getLine
    contents <- readFile path
    writeFile path (map toUpper contents)

сейчас, очевидно, основная разница здесь в том, что я читаю и пишу в один и тот же файл. Сейчас я думаю об этом, это должно быть ленивая оценка, но я получаю сообщение об ошибке «ресурс занят». Поправьте меня, если я ошибаюсь, но я предполагаю, что readFile не начинает читать файл, пока writeFile не запросит его содержимое. Затем writeFile пытается записать в файл, но он все еще должен иметь файл открытым, потому что он также запрашивает содержимое. Я там близко?

Итак, реальный вопрос: как мне читать и писать в один и тот же файл в Haskell? Логично, что это сложнее, потому что вы будете писать в файл, отличный от файла, из которого читаете чаще всего, но для моего собственного назидания, как бы вы читали и записывали в один и тот же файл?

14
задан Ramy 21 February 2011 в 20:47
поделиться