sch*_*kin 5 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
Run Code Online (Sandbox Code Playgroud)
这里我从resource2清理操作访问resource1,所以我希望resource1将始终在resource1之后被释放,否则代码将是不正确的.至少在目前的实施中这是事实.如果我运行代码,我会得到:
allocator1
allocator2
accessResource
deallocator2
deallocator1
Run Code Online (Sandbox Code Playgroud)
是否MonadResource始终隔离先前分配的资源(因此可以从以后的清理操作中访问)将在以后取消分配,或者解除分配顺序是特定于实现的?如果具体实施,保证特定解除分配顺序的最佳方法是什么?