Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何处置/释放;定稿;共享值超出范围时的非托管资源_Haskell_Garbage Collection_Dispose_Ghc_Finalizer - Fatal编程技术网

Haskell 如何处置/释放;定稿;共享值超出范围时的非托管资源

Haskell 如何处置/释放;定稿;共享值超出范围时的非托管资源,haskell,garbage-collection,dispose,ghc,finalizer,Haskell,Garbage Collection,Dispose,Ghc,Finalizer,我有一个封装外部资源密钥的类型。一旦密钥丢失(共享它的所有值都超出范围),应该在下一次垃圾收集时(隐式地)释放资源,就像内存对常规值所做的那样 因此,我正在寻找类似于OOP的东西,或者,只是表示对来自外语的对象以外的其他对象的引用(尽管如果我也能正确且优雅地处理这个问题,知道如何回答这个问题) 可能吗?如果是这样的话,怎么做?我建议您看看: ResourceT是一个monad转换器,它创建一个代码区域,其中 您可以安全地分配资源 你可以用这个 不幸的是,弱引用的语义一开始可能有点难以理解。警告说

我有一个封装外部资源密钥的类型。一旦密钥丢失(共享它的所有值都超出范围),应该在下一次垃圾收集时(隐式地)释放资源,就像内存对常规值所做的那样

因此,我正在寻找类似于OOP的东西,或者,只是表示对来自外语的对象以外的其他对象的引用(尽管如果我也能正确且优雅地处理这个问题,知道如何回答这个问题)

可能吗?如果是这样的话,怎么做?

我建议您看看:

ResourceT是一个monad转换器,它创建一个代码区域,其中 您可以安全地分配资源

你可以用这个

不幸的是,弱引用的语义一开始可能有点难以理解。警告说明尤其重要

如果您可以在密钥上附加一个或,并创建一个与之相关联的弱引用/终结器,那么它可能会更加可靠

在特殊情况下,您的密钥是指向非托管内存(例如某些C数据结构)的指针,您应该创建一个并向其附加一个终结器。这些终结器的语义有些不同;终结器必须是指向外部函数的函数指针,而不是任意IO操作