为什么括号需要`release`来产生被忽略的结果?

时间:2016-07-17 13:21:25

标签: haskell exception-handling

bracket
        :: IO a         -- ^ computation to run first (\"acquire resource\")
        -> (a -> IO b)  -- ^ computation to run last (\"release resource\")
        -> (a -> IO c)  -- ^ computation to run in-between
        -> IO c         -- returns the value from the in-between computation
bracket before after thing =
  mask $ \restore -> do
    a <- before
    r <- restore (thing a) `onException` after a
    _ <- after a
    return r

这与某些API设计模式或约定有关吗?为什么不使用以下签名部分?

        -> (a -> IO ())  -- ^ computation to run last (empty result)

        -> (a -> IO a)  -- ^ computation to run last (`a` cannot be ignored)

1 个答案:

答案 0 :(得分:7)

我认为你倒退了 - bracket会忽略释放操作的结果。

如果发布操作的签名是a -> IO (),那么您必须提供始终返回()的函数。通过制作签名a -> IO b,您的发布函数可以返回任何内容 类型变量b未在签名-i.e中的任何其他位置引用。 它与任何其他类型变量完全无关。