2011-07-07 83 views
18

假設有人把這種簡單的Python代碼哈斯克爾:避免「分享」的好方法?

def important_astrological_calculation(digits): 
    # Get the first 1000000 digits of Pi! 
    lucky_numbers = calculate_first_digits_of_pi(1000000) 
    return digits in lucky_numbers 

哈斯克爾版本:

importantAstrologicalCalculation digits = 
    isInfixOf digits luckyNumbers 
    where 
    luckyNumbers = calculateFirstDigitsOfPi 1000000 

與哈斯克爾版本的工作後,程序員是驚訝地發現,他的哈斯克爾版本「泄漏「記憶 - 在第一次調用他的功能後,luckyNumbers永遠不會被釋放。這很麻煩,因爲該程序包含一些更類似的功能,並且所有這些功能消耗的內存都很重要。

是否有一種簡單而優雅的方式讓程序「忘記」luckyNumbers

+1

不優雅,但是如果你添加'{ - #NOINLINE importantAstrologicalCalculation# - }',會發生什麼? –

+4

最近有一個問題,明顯地詢問同樣的事情,但使用更先進的術語。你可能想看看它:http://stackoverflow.com/questions/6090932/how-to-make-a-caf-not-a-caf-in-haskell – Rotsor

回答

19

在這種情況下,您的pidigits列表是一個常量(或「恆定應用形式 ),並且GHC可能會將其浮出,計算一次並共享使用情況。如果沒有對CAF的引用,將垃圾收集

現在,在一般情況下,如果你想要的東西要重新計算,把它變成一個功能(例如,通過添加僞()參數)在CAF中鏈接的問題。例如:。How to make a CAF not a CAF in Haskell?

+0

+1指向一個類似的指針題。 –

+0

是否浮動它改變任何東西? stackoverflow.com/questions/6208006創建一個類似的情況,沒有任何東西是一個常數.. – yairchu