Nik*_*kos 7 caching ocaml weak-references memoization
我正在寻找一种方法来记忆OCaml函数的结果,该函数f需要两个参数(或者更多,一般来说).另外(这是困难的部分),如果两个参数的任何一个值都是垃圾收集的话,我希望这个过程的底图完全忘记一个结果.
对于只接受一个参数的函数,可以通过Weak模块及其Make函数以简单的方式完成.为了将这一点概括为可以记忆更高级别的函数的东西,一个天真的解决方案是创建一个从值元组到结果值的弱映射.但是这对垃圾收集来说无法正常工作,因为值的元组只存在于memoization函数的范围内,而不是调用的客户端代码f.事实上,弱引用将是元组,它将在备忘录后立即进行垃圾收集(在最坏的情况下).
没有重新实现,有没有办法做到这一点Weak.Make?
Hash-consing与我的要求是正交的,事实上,我的价值观并不理想.
谢谢!
您可以使用树结构来代替元组索引。您将有一个由第一个函数参数索引的弱表,其条目是辅助弱表。辅助表将由第二个函数参数索引并包含记忆的结果。一旦任一函数参数被GCed,该结构就会忘记记忆的函数结果。但是,只要第一个函数参数处于活动状态,辅助表本身就会保留。根据函数结果的大小和不同第一个参数的分布,这可能是一个合理的权衡。
我也没有测试过这个。这似乎也相当明显。