मेरे पास हैस्केल में सरणी का उपयोग करके कैशिंग (ज्ञापन) को लागू करने के बारे में एक प्रश्न है। निम्नलिखित पैटर्न काम करता है:हास्केल फ़ंक्शन परिभाषा और कैशिंग सरणी
f = (fA !)
where fA = listArray...
लेकिन यह नहीं है (कार्यक्रम की गति पता चलता है कि सरणी प्रत्येक कॉल या कुछ और निर्मित हो रही है): एक जहां खंड के
f n = (fA ! n)
where fA = listArray...
डिफाइनिंग एफए के बाहर ("वैश्विक दायरे" में) भी पैटर्न के साथ काम करता है।
मैं उम्मीद कर रहा था कि कोई मुझे तकनीकी स्पष्टीकरण की दिशा में इंगित कर सकता है कि उपरोक्त दो पैटर्न के बीच क्या अंतर है।
ध्यान दें कि मैं नवीनतम जीएचसी का उपयोग कर रहा हूं, और मुझे यकीन नहीं है कि यह सिर्फ एक कंपाइलर विशिष्टता या भाषा का हिस्सा है।
संपादित करें:! सरणी के उपयोग के लिए प्रयोग किया जाता है, तो एफए! 5 का अर्थ है सी ++ वाक्यविन्यास में एफए [5]। हास्केल की मेरी समझ यह है कि (एफए!) एन वही होगा (एफए! एन) ... यह भी मेरे लिए "एफ एन = एफए! एन" (कोष्ठक के बिना) लिखने के लिए और अधिक पारंपरिक होता। वैसे भी, मुझे वही व्यवहार मिलता है इससे कोई फर्क नहीं पड़ता कि मैं कैसे संश्लेषित करता हूं।
एक समान प्रश्न यहां पोस्ट किया गया था: http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell - हालांकि थोड़ा और स्पष्ट रूप से बताया गया है, और कुछ अच्छे प्रतिक्रियाओं के साथ। –