file - 在 Haskell 中读取和写入文件

标签 file haskell io

我正在尝试读取文件的内容,将文本转换为大写,然后将其写回。

这是我写的代码:

import System.IO
import Data.Char

main = do
    handle <- openFile "file.txt" ReadWriteMode
    contents <- hGetContents handle
    hClose handle
    writeFile "file.txt" (map toUpper contents)
    return ()

但是,这不会向文件写入任何内容,事实上,它甚至会清除它。

我做了一些改变:
main = do
    handle <- openFile "file.txt" ReadWriteMode
    contents <- hGetContents handle
    writeFile "file.txt" (map toUpper contents)
    hClose handle
    return ()

但是,我收到错误 resource busy (file is locked) .我怎样才能让这个工作和为什么在这两种情况下都不起作用?

最佳答案

Lazy IO 不好,这通常被认为是 Haskell 中的一个痛点。基本上是 contents在您将其写回磁盘之前不会对其进行评估,此时由于文件已关闭,因此无法对其进行评估。您可以通过多种方式解决此问题,无需借助额外的库,您可以使用 readFile函数,然后在写回之前检查长度:

import Control.Monad (when)

main = do
    contents <- readFile "file.txt"
    let newContents = map toUpper contents
    when (length newContents > 0) $
        writeFile "file.txt" newContents

我会说这段代码实际上更好,因为你不会写回一个已经为空的文件,这是一个毫无意义的操作。

另一种方法是使用流媒体库,pipes是一个受欢迎的选择,有一些很好的教程和坚实的数学基础,这也是我的选择。

关于file - 在 Haskell 中读取和写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342012/

相关文章:

haskell - 定义数字的连接函数

java - 套接字客户端-服务器在发送到服务器端后卡住

haskell - Haskell 中嵌套列表的模式匹配

testing - 如何让 Test-Framework 报告 QuickCheck 失败的原因?

c++ FILE结构参数含义

python - 数据雕刻循环改进

java - 无法在 ubuntu 中访问 graph.db

bash - 从重命名脚本中排除文件类型

java - 无法重命名文件

python - 异常退出期间文件是否关闭?