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)
答案 0 :(得分:7)
我认为你倒退了 - bracket
会忽略释放操作的结果。
如果发布操作的签名是a -> IO ()
,那么您必须提供始终返回()
的函数。通过制作签名a -> IO b
,您的发布函数可以返回任何内容
类型变量b
未在签名-i.e中的任何其他位置引用。
它与任何其他类型变量完全无关。