在具有懶惰語義的純功能性的語言(如Haskell中),計算的結果被memoized使得具有相同的輸入的功能的進一步的評估不重新計算的值而是直接從memoized值的高速緩存得到它。像Haskell這樣的函數式語言中,memoized值的生命期是多少?
我想知道如果這些memoized值獲得在某個時間點回收?
- 如果是這樣,則意味着memoized值必須在稍後的時間重新計算,並記憶化的好處是不那麼退出恕我直言。
- 如果沒有,那麼OK,這是聰明的緩存的一切......但它意味着一個程序 - 如果運行時間足夠長一段 - 將 總是消耗越來越多的內存?
想象一個程序執行密集的數值分析:例如,要查找的使用二分法算法幾千幾百數學函數列表的根。
每次節目評估與特定的實數的數學函數,結果將被memoized。但是,只有一個非常小的概率 是完全一樣的實數將在算法中再次出現,導致內存泄露(或至少,真的不好的用法)。
我的想法是,也許memoized的值只是「作用域」的程序中的某些東西(例如對當前的延續,調用堆棧等),但我無法找到有關該主題的實用內容。
我承認我沒有在Haskell編譯執行深深的看了(懶惰?),但請,可能有人向我解釋,在實踐中是如何工作的?
編輯:好吧,我明白了從最初的幾個回答我的錯誤:純語義意味着引用透明而這又並不意味着自動記憶化,而只是保證會有它沒有問題。
我認爲網上的一些文章會誤導這件事,因爲從初學者的角度來看,參考透明屬性看起來很酷,因爲它允許隱式記憶。
查看http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell – 2011-05-22 16:11:36