withFile关闭文件到早期

时间:2018-05-02 11:31:12

标签: file haskell io lazy-evaluation

运行以下代码后

mycourse$.COURSE

我只将withFile "file.txt" ReadWriteMode (\h -> hGetContents h >>= putStrLn >> hGetContents h >>= putStrLn) 的内容打印一次然后收到以下异常:

file.txt

为什么Haskell如此早地关闭文件以至于我无法执行所有想要的操作?文档说

  

当计算返回 时,句柄将自动关闭

在这种情况下似乎不是真的。

为什么它的行为如此,以及如何在单个处理程序上链接多个IO操作?

1 个答案:

答案 0 :(得分:4)

hGetContents将文件句柄置于“半封闭”状态。在此之后,该句柄上的所有显式操作都无效。这与withFile无关;你不能在同一个句柄上使用hGetContents两次。

通常,您希望 在整个过程中使用延迟I / O(例如,readFile),在整个过程中使用显式I / O(使用withFile和朋友们)。优选后者。试图混合两者可能只会导致问题。

通常,懒惰I / O适用于快速原型设计,但在预测底层OS资源何时发布方面确实存在很多缺点。