2011-07-07 10 views
18

मान लीजिए कि किसी हास्केल को यह साधारण अजगर कोड अनुवाद होगा:"साझाकरण" से बचने का एक अच्छा तरीका है?

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 महत्वपूर्ण ज्योतिषीय गणना # -}' –

+4

जोड़ते हैं, हाल ही में एक सवाल था, जाहिर है कि वही बात पूछ रही है, लेकिन अधिक उन्नत शब्दावली का उपयोग कर। आप इसे देखना चाहते हैं: http://stackoverflow.com/questions/6090932/how-to-make-a-caf-not-a-caf-in-haskell – Rotsor

उत्तर

19

इस मामले में, आपकी पिडिजिट सूची एक स्थिर (या "निरंतर आवेदक फॉर्म ) है, और जीएचसी शायद इसे बाहर निकाल देगा, इसे एक बार गणना करेगा, और उपयोगों के बीच साझा करेगा। अगर सीएएफ के कोई संदर्भ नहीं हैं, तो , कचरा एकत्र किया जाएगा

अब, सामान्य रूप में आप कुछ पुनर्गणना किया जाना चाहते हैं, यह एक समारोह (एक डमी () पैरामीटर जोड़कर जैसे) में बदल जाते हैं, तो cafs पर जुड़ा हुआ प्रश्न में उदाहरण:।। How to make a CAF not a CAF in Haskell?

नहीं
+0

+1 पॉइंटर के समान +1 के लिए +1 सवाल। –

+0

क्या इसे बाहर फ़्लोट करना कुछ भी बदलता है? stackoverflow.com/questions/6208006 बिना किसी स्थिरता के एक समान स्थिति बनाता है .. – yairchu

संबंधित मुद्दे

 संबंधित मुद्दे