运行以下代码后
mycourse$.COURSE
我只将withFile "file.txt" ReadWriteMode
(\h -> hGetContents h >>= putStrLn >> hGetContents h >>= putStrLn)
的内容打印一次然后收到以下异常:
file.txt
为什么Haskell如此早地关闭文件以至于我无法执行所有想要的操作?文档说
当计算返回 时,句柄将自动关闭 。
在这种情况下似乎不是真的。
为什么它的行为如此,以及如何在单个处理程序上链接多个IO操作?
答案 0 :(得分:4)
hGetContents
将文件句柄置于“半封闭”状态。在此之后,该句柄上的所有显式操作都无效。这与withFile
无关;你不能在同一个句柄上使用hGetContents
两次。
通常,您希望 在整个过程中使用延迟I / O(例如,readFile
),或在整个过程中使用显式I / O(使用withFile
和朋友们)。优选后者。试图混合两者可能只会导致问题。
通常,懒惰I / O适用于快速原型设计,但在预测底层OS资源何时发布方面确实存在很多缺点。