haskell - MonadResource 中的资源释放顺序

标签 haskell monad-transformers

MonadResource 能够跟踪多个资源。有时这些资源的释放顺序很重要。考虑以下代码:

allocator1 = putStrLn "allocator1"
deallocator1 = putStrLn "deallocator1"

allocator2 = putStrLn "allocator2"
deallocator2 = putStrLn "deallocator2"

accessResource = const $ putStrLn "accessResource"

resourceTest :: MonadResource m => m ()
resourceTest = do
    (_, resource1) <- allocate allocator1 $ const deallocator1
    (_, resource2) <- allocate allocator2 $ const $ accessResource resource1 >> deallocator2
    return ()

main = runResourceT resourceTest 

这里我从resource2清理操作中访问resource1,所以我希望resource1总是在resource1之后被释放,否则代码将不正确。至少在当前的实现中确实如此。如果我运行代码我会得到:

allocator1
allocator2
accessResource
deallocator2
deallocator1

MonadResource 是否始终隔离先前分配的资源(因此可以从以后的清理操作中访问)稍后将被释放,或者释放顺序是特定于实现的?如果它具体实现的话,保证特定释放顺序的最佳方法是什么?

最佳答案

自版本 0.3.2.1 起,释放始终按 LIFO 顺序。这是为了响应issue #46而改变的。 ,其中包含更多信息。换句话说,您可以依赖 deallocator2 始终在 deallocator1 之前运行。

关于haskell - MonadResource 中的资源释放顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477635/

相关文章:

haskell - 将带有 monad 参数的函数提升到 monad 转换器中

haskell - 我可以把 IO monad 漂亮地放在这个纯函数上吗?

haskell - Monad 转换器 monad 重复

haskell - 如何创建 MonadRandom (StateT PureMT m0)? ( haskell )

haskell - Haskell 中惰性和并行性如何共存?

haskell - 以foldr 来定义scanr 是如何工作的?

haskell - 取决于上下文的多态返回类型

algorithm - Haskell:对几乎排序的数组进行排序

haskell - 管道的上游类型参数的真正好处是什么?

f# - FSharpPlus : the fsi blocks when I try to combine two transformers