我正在寻找一种方法来记忆 OCaml 函数的结果,该函数f
需要两个参数(通常是更多参数)。此外(这是困难的部分),如果两个参数的任何一个值被垃圾收集,我希望这个过程的映射完全忘记结果。
对于只接受一个参数的函数,这可以通过Weak
模块及其Make
函子以一种直接的方式完成。为了将其推广到可以记忆更高数量的函数的东西,一个天真的解决方案是创建一个从值元组到结果值的弱映射。但这对于垃圾回收将无法正常工作,因为值的元组仅存在于 memoization 函数的范围内,而不存在于调用f
. 事实上,弱引用将指向元组,它将在记忆化后立即被垃圾收集(在最坏的情况下)。
有没有办法在不重新实现的情况下做到这一点Weak.Make
?
Hash-consing 与我的要求是正交的,事实上,对于我的价值观来说并不是很理想。
谢谢!