如何解决Haskell 中的异常处理和纯度
在Real World Haskell的获取-使用-释放周期部分中,显示了bracket
的类型:
ghci> :type bracket
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
现在,从 description of bracket
中,我了解到 a -> IO c
类型的函数正在运行时可能会引发异常。参考本书,这个异常被调用函数捕获,通过handle
:
getFileSize path = handle (\_ -> return Nothing) $
bracket (openFile path ReadMode) hClose $ \h -> do
size <- hFileSize h
return (Just size)
我不禁想到,当 bracket
的第三个参数确实发生异常时,bracket
不会返回 IO c
。
这与纯度有什么关系?
我认为答案可能正好是 this,但我不确定。
解决方法
我不禁想到,当括号的第三个参数确实发生异常时,括号不会返回 IO c
。
Prelude> fail "gotcha" :: IO Bool
*** Exception: user error (gotcha)
如您所见,不会产生 Bool
(分别为 c
)值。没关系,因为动作不会结束——而是重新引发异常。该异常可能会导致程序崩溃,或者可能会在调用代码的其他地方再次被捕获——重要的是,无论谁捕获它都会a) 无法获得结果值(“c
” ),如果出现异常,您永远不会这样做; b) 不需要担心关闭文件句柄,因为这已经由 bracket
完成了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。