Как сказал К.А. Макканн, это должно быть уже лениво;однако appendFile
, скорее всего, по умолчанию откроет файл в режиме с буферизацией блоков, что означает, что строки не будут очищены при их создании;вместо этого данные будут записываться в файл по несколько тысяч байт за раз.Чтобы решить эту проблему, просто сверните свою собственную функцию:
import System.IO
appendFileLines :: FilePath -> String -> IO ()
appendFileLines fileName text =
withFile fileName AppendMode $ \h -> do
hSetBuffering h LineBuffering
hPutStr h text
Затем вы можете использовать appendFileLines
вместо appendFile
, и файл будет записываться в одну запись за раз.
То, о чем вы, возможно, думаете, с точки зрения выполнения операций ввода-вывода с ленивыми результатами, называется «ленивый ввод-вывод»;как правило, это осуждается, но для достижения желаемого эффекта здесь не обязательно.(Если, например, вы знаете, как работают readFile
или getContents
, это ленивый ввод-вывод.)