【问题标题】:Exception handling and purity in HaskellHaskell 中的异常处理和纯度
【发布时间】:2021-02-14 18:37:16
【问题描述】:

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,但我不确定。

【问题讨论】:

    标签: haskell exception functional-programming purely-functional io-monad


    【解决方案1】:

    我不禁想到,当括号的第三个参数中确实发生异常时,括号不会返回IO c

    Prelude> fail "gotcha" :: IO Bool
    *** Exception: user error (gotcha)
    

    如您所见,不会产生 Bool(分别为 c)值。没关系,因为操作没有结束——而是重新引发异常。然后该异常可能会导致程序崩溃,或者在调用代码的其他地方再次被捕获 - 重要的是,捕获它的人将 a) 不会得到结果值(“c”),万一出现异常,你永远不会这样做; b) 不需要担心关闭文件句柄,因为bracket 已经完成了。

    【讨论】:

    • 请注意,虽然没有返回 c,但表达式最终会返回 IO c 类型的值——此类值包括异常行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多