我对 Haskell 很陌生。事实上,我正在努力本教程的这一部分。 http://learnyouahaskell.com/input-and-output#files-and-streams我遇到了这段代码:
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 中读取和写入同一个文件?这是有道理的,它更困难,因为你会经常写入与你读取的文件不同的文件,但对于我自己的启发,你将如何读取和写入同一个文件?
确实,这是一个“懒惰评价的事情”。
import System.IO
import Data.Char
main = do
path <- getLine
contents <- readFile path
writeFile path (map toUpper contents)
请记住,Haskell 主要是懒于计算,IO 子系统的大部分也是如此。因此,当您调用“readFile”时,您开始从文件中流式传输数据。当您立即调用“writeFile”时,您开始将字节流回同一文件
这将是一个错误(即破坏你的数据),因此 Haskell 会锁定资源直到它被完全评估,并且你会收到一条很好的错误消息。
有两种解决方案:
- 不要破坏性地覆盖文件,而是复制到新文件
- 或者,使用严格IO
要使用严格 IO,建议使用“text”或“strict”包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)