gpt4 book ai didi

haskell - 从 hGetContents 检测惰性字符串中的 I/O 异常?

转载 作者:行者123 更新时间:2023-12-02 12:21:48 27 4
gpt4 key购买 nike

hGetContents返回一个惰性 String 对象,可在纯函数代码中使用该对象从文件句柄中读取。如果在读取此惰性字符串时发生 I/O 异常,则底层文件句柄将静默关闭,并且不会向惰性字符串添加任何其他字符。

如何检测此 I/O 异常?

作为一个具体示例,请考虑以下程序:

import System.IO    -- for stdin

lengthOfFirstLine :: String -> Int
lengthOfFirstLine "" = 0
lengthOfFirstLine s = (length . head . lines) s

main :: IO ()
main = do
lazyStdin <- hGetContents stdin
print (lengthOfFirstLine lazyStdin)

如果读取文件第一行时发生异常,该程序将打印字符数,直到发生 I/O 异常。相反,我希望程序因适当的 I/O 异常而崩溃。如何修改该程序以具有这种行为?

编辑:仔细检查 hGetContents 实现后,似乎 I/O 异常没有被忽略,而是通过调用纯函数代码向上冒泡到触发评估的任何 IO 代码,然后有机会处理它。 (我之前并不知道纯函数代码可能会引发异常。)因此这个问题是一个误解。

旁白:最好通过经验验证这种异常行为。不幸的是,很难模拟低级 I/O 错误。

最佳答案

惰性 IO is considered to be a pitfall许多 haskellers 都这样做,因此建议远离。您的案例生动地描述了原因。

有一个non-lazy alternative of hGetContents function 。它适用于 Text,但 Text 也是 String 的普遍首选替代方案。为了方便起见,有现代前奏,将 String 替换为 Text:basic-preludeclassy-prelude .

关于haskell - 从 hGetContents 检测惰性字符串中的 I/O 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com