多參數功能弱memoizing結果我正在尋找一種方式來memoize的一個OCaml的功能f
採用兩個參數(或更多,在一般情況)的結果。另外(這是困難的部分),如果兩個參數的任何一個值都是垃圾收集的,我希望這個過程的映射完全忘記一個結果。OCaml中
對於只需要一個參數的函數,可以通過Weak
模塊及其Make
函子以簡單明瞭的方式完成。爲了將其推廣到可以記憶更高級別函數的東西,一個天真的解決方案是創建一個從值元組到結果值的弱映射。但是這對於垃圾收集來說不能正確工作,因爲值的元組只存在於memoization函數的範圍內,而不是調用f
的客戶端代碼。實際上,弱引用將是元組,它將在記憶後立即被垃圾收集(在最壞的情況下)。
有沒有辦法做到這一點,而不需要重新實施Weak.Make
?
Hash-consing與我的要求是正交的,事實上,對於我的價值觀來說並不是真正需要的。
謝謝!
我可以看到第一個參數值的垃圾回收會如何導致釋放第二個參數的相應表。然而,即使結果圖爲空,對錶中的第二個參數進行GC化也不會對其父(如果使用「Weak」模塊)執行任何操作。當然,這可以通過主動掃描地圖的內容並刪除映射到空表的第一個參數鍵來完成。 – Nikos 2012-04-08 08:20:28
正如我所說的,直到第一個參數被釋放後,輔助表纔會被收集。但是回憶價值會被收集(在我看來)。 – 2012-04-08 14:58:06