OCaml中

问题描述:

多参数功能弱memoizing结果我正在寻找一种方式来memoize的一个OCaml的功能f采用两个参数(或更多,在一般情况)的结果。另外(这是困难的部分),如果两个参数的任何一个值都是垃圾收集的,我希望这个过程的映射完全忘记一个结果。OCaml中

对于只需要一个参数的函数,可以通过Weak模块及其Make函子以简单明了的方式完成。为了将其推广到可以记忆更高级别函数的东西,一个天真的解决方案是创建一个从值元组到结果值的弱映射。但是这对于垃圾收集来说不能正确工作,因为值的元组只存在于memoization函数的范围内,而不是调用f的客户端代码。实际上,弱引用将是元组,它将在记忆后立即被垃圾收集(在最坏的情况下)。

有没有办法做到这一点,而不需要重新实施Weak.Make

Hash-consing与我的要求是正交的,事实上,对于我的价值观来说并不是真正需要的。

谢谢!

而非索引的你可以有一个树状结构。您将有一个由第一个函数参数索引的弱表,它的条目是次级弱表。辅助表格将由第二个函数参数索引并包含记忆结果。只要函数参数为GCed,该结构就会忘记记忆功能结果。但是,只要第一个函数参数处于活动状态,辅助表格本身就会保留。根据你的函数结果的大小和不同的第一个参数的分布,这可能是一个合理的折衷。

我还没有测试过这个。这似乎也很明显。

+0

我可以看到第一个参数值的垃圾回收会如何导致释放第二个参数的相应表。然而,即使结果图为空,对表中的第二个参数进行GC化也不会对其父(如果使用“Weak”模块)执行任何操作。当然,这可以通过主动扫描地图的内容并删除映射到空表的第一个参数键来完成。 – Nikos 2012-04-08 08:20:28

+0

正如我所说的,直到第一个参数被释放后,辅助表才会被收集。但是回忆价值会被收集(在我看来)。 – 2012-04-08 14:58:06

一个想法是执行你自己的垃圾收集。

为简单起见,我们假设所有的参数都相同类型k

除了含有由k * k键入的memoized结果的主要弱表,创建包含k类型的单个参数的次级弱表。这个想法是一次扫描主表,并删除不再需要的绑定。这是通过查找次表中的参数完成的;那么如果它们中的任何一个都不存在,则从主表中删除绑定。

(声明:我没有测试过这一点;它可能无法正常工作或有可能是更好的解决方案)的元组

+0

好点。也许只需要一个表,其中一个具有弱引用的元组作为关键字,并且每当关键元组中的任何弱引用消失时都会收集自定义垃圾。这可以通过终结者来完成吗? – Nikos 2012-04-07 17:09:25

我知道这是一个老问题,但我的同事们最近开发的增量计算库,称为Adapton,可以处理这个功能。你可以找到代码here。您可能想要使用LazySABidi仿函数(其他用于基准测试)。您可以在Applications文件夹中查找如何使用库的示例。如果您还有其他问题,请告诉我。