हास्केल के लिए नौसिखिया के रूप में एक फ़ंक्शन दोहराएं, मैं एक फ़ंक्शन (उदा। लॉजिस्टिक मैप) को बड़ी संख्या में फिर से चलाने की कोशिश कर रहा हूं। एक अनिवार्य भाषा में यह एक साधारण लूप होगा, हालांकि हास्केल में मैं स्टैक ओवरफ़्लो के साथ समाप्त होता हूं। पुनरावृत्तियों कोड काम करता है की एक छोटी संख्या के लिएहास्केल: बिना किसी स्टैक ओवरफ्लो
main = print $ iter 1000000
f x = 4.0*x*(1.0-x)
iter :: Int -> Double
iter 0 = 0.3
iter n = f $ iter (n-1)
, लेकिन एक लाख पुनरावृत्तियों के लिए मैं एक ढेर अंतरिक्ष अतिप्रवाह मिलती है:: इस कोड उदाहरण के लिए ले लो
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
मैं नहीं समझ सकता क्यों होता है। पूंछ रिकर्सन ठीक होना चाहिए। शायद समस्या आलसी मूल्यांकन है। मैंने विभिन्न पदों पर $!
या seq
डालने से सख्त मूल्यांकन को मजबूर करने के कई तरीकों से प्रयोग किया, लेकिन कोई सफलता नहीं मिली।
एक समारोह को फिर से चलाने के लिए हास्केल तरीका क्या होगा?
मैं संबंधित पोस्ट से सुझाव की कोशिश की है: here या here, लेकिन मैं हमेशा पुनरावृत्तियों की एक बड़ी संख्या है, जैसे, main = print $ iterate f 0.3 !! 1000000
के लिए stackoverflow के साथ समाप्त हो गया।
समस्या यह है कि आपके पास पूंछ रिकर्सन नहीं है क्योंकि आप सीधे 'iter (n-1) ' – Simon
वापस नहीं लौट रहे हैं यह मजाकिया है कि लोगों को केवल पूंछ की पुनरावृत्ति नहीं मिलती है। एफवाईआई, यह परिभाषा गलत है: "जब फ़ंक्शन का नाम हम उस फ़ंक्शन की अंतिम पंक्ति पर दिखाई देते हैं"। – Ingo