यह बहुत अच्छा स्पष्टीकरण नहीं है।
"बाहर मंगाई" का अर्थ है कि में:
\x -> let y = ... in z
अगर ...
एक्स का उल्लेख नहीं करता तो यह लैम्ब्डा की बाहर जारी किया जा सकता है:
let y = ... in \x -> z
यह जिसका मतलब है केवल एक बार गणना की जाएगी, जो ...
महंगा है तो बहुत समय बचा सकता है। हालांकि, जीएचसी इस तरह के अनुकूलन करने के बारे में रूढ़िवादी है, क्योंकि वे अंतरिक्ष लीक पेश कर सकते हैं। (हालांकि यह दूसरी परिभाषा के लिए ऐसा करता है यदि आप इसे एक प्रकार का हस्ताक्षर देते हैं, क्योंकि डैनियल फिशर अपने जवाब में बताते हैं।)
हालांकि यह स्वचालित अनुकूलन के बारे में नहीं है। पहला स्निपेट लैम्ब्डा के बाहर fib'
को परिभाषित करता है, जबकि दूसरा इसे अंदर परिभाषित करता है (लैम्ब्डा fib x = ...
में अंतर्निहित है, जो fib = \x -> ...
के बराबर है), जो उद्धरण कह रहा है।
यहां तक कि यह वास्तव में प्रासंगिक नहीं है, हालांकि; क्या प्रासंगिक है कि पहले स्निपेट में, map fib' [0 ..]
लैम्ब्डा के बाहर होता है, और इसलिए इसका परिणाम लैम्ब्डा के सभी अनुप्रयोगों के बीच साझा किया जाता है (उस कोड में, "लैम्ब्डा" (!!)
के आंशिक अनुप्रयोग से उत्पन्न होता है)। बाद में, यह लैम्ब्डा के अंदर है, और fib
के प्रत्येक एप्लिकेशन के लिए पुन: संकुचित होने की संभावना है।
अंतिम परिणाम यह है कि पूर्व कार्यान्वयन मूल्यों को कैश करता है और इसलिए बाद के मुकाबले कहीं अधिक कुशल होता है। ध्यान दें कि पहली स्निपेट की दक्षता इस तथ्य पर निर्भर है कि fib'
सीधे रिकर्स नहीं करता है, बल्कि इसके बजाय fib
के माध्यम से, और इसलिए ज्ञापन से लाभ प्राप्त होता है।
यह ईटा-विस्तार से संबंधित है; बाद वाला स्निपेट पहले का ईटा-विस्तार है। लेकिन आपके द्वारा उद्धृत बयान में यह नहीं बताया गया है कि क्या हो रहा है।
ध्यान दें कि यह कार्यान्वयन-विशिष्ट व्यवहार है, और हास्केल के अर्थशास्त्र का हिस्सा नहीं है। हालांकि, सभी उचित कार्यान्वयन इस तरह से व्यवहार करेंगे।
यह उत्तर और डैनियल फिशर का उत्तर अब पारस्परिक रूप से रिकर्सिव है। – misterbee
@ मिस्टरबी: सौभाग्य से, केवल हास्केल प्रोग्रामर उन्हें पढ़ेंगे, और हम आलसी हैं, है ना? – leftaroundabout