2011-07-07 11 views
18

Przypuśćmy, że ktoś przetłumaczyć ten prosty kodu Pythona do Haskell: WersjaDobry sposób na uniknięcie "udostępniania"?

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 

Haskell:

importantAstrologicalCalculation digits = 
    isInfixOf digits luckyNumbers 
    where 
    luckyNumbers = calculateFirstDigitsOfPi 1000000 

Po pracy z wersją Haskell, programista jest zdumieniem odkrywa, że ​​jego wersja Haskell „przecieki "pamięć - po raz pierwszy jego funkcja jest wywoływana, luckyNumbers nigdy się nie zwalnia. To niepokojące, ponieważ program zawiera kilka bardziej podobnych funkcji, a pamięć konsumowana przez nich wszystkich jest znacząca.

Czy istnieje prosty i elegancki sposób, aby program "zapomnieć" luckyNumbers?

+1

Nie elegancki, ale co się stanie, jeśli dodasz '{- # NOINLINE importantAstrologicalCalculation # -}'? –

+4

Było ostatnio pytanie, zadając podobno to samo, ale używając bardziej zaawansowanej terminologii. Możesz rzucić okiem na to: http://stackoverflow.com/questions/6090932/how-to-make-a-caf-not-a-cerf-in-haskell – Rotsor

Odpowiedz

19

W tym przypadku twoja pidigit lista jest stała (lub "stała forma aplikacyjna ), a GHC prawdopodobnie ją uaktywni, wyliczy ją raz i podzieli po użyciu .Jeśli nie ma żadnych odniesień do CAF, to będzie śmieci zbierane

teraz w ogóle, jeśli chcesz coś być przeliczony, przekształcić go w funkcji (na przykład przez dodanie obojętne () parametr) Przykłady w połączonej pytaniem na CAFS.. How to make a CAF not a CAF in Haskell?

+0

+1 za wskaźnik do podobnego pytanie. –

+0

Czy przestawienie go zmienia coś? stackoverflow.com/questions/6208006 tworzy podobną sytuację, ale nic nie jest stałe. – yairchu

Powiązane problemy