क्लोजर उल्लंघन नहीं हैं क्योंकि हास्केल में सभी बाइंडिंग अपरिवर्तनीय हैं। वास्तव में क्या बंद होने का मतलब यह है कि मुक्त चर के साथ एक लैम्ब्डा एक अद्वितीय कार्य को इंगित नहीं करता है; यह अलग-अलग कार्यों को इंगित करेगा जो बाइंडिंग के आधार पर प्रभावी रूप से प्रभावी होते हैं जब प्रत्येक बार इसका मूल्यांकन किया जाता है। उदा .:
makeClosure :: Num a => a -> a -> a
makeClosure x = \y -> x+y
अभिव्यक्ति makeClosure 5
makeClosure 6
तुलना में एक अलग समारोह का मूल्यांकन; और अधिक महत्वपूर्ण बात यह है कि कार्यक्रम के विभिन्न हिस्सों में makeClosure 5
की दो घटनाएं उसी फ़ंक्शन पर मूल्यांकन करती हैं, जैसा कि makeClosure (2+3)
या इसी प्रकार है; यानी, हमारे पास रेफरेंसियल पारदर्शिता है (उनके बराबर के साथ अभिव्यक्तियों को प्रतिस्थापित करना एक प्रोग्राम के अर्थ को संरक्षित करता है)।
आपके द्वारा उल्लेख किए गए उद्धरण में "राज्य" के अर्थ पर आप उलझन में प्रतीत होते हैं। इस संदर्भ में राज्य का अर्थ परिवर्तनीय डेटा है; बंद निश्चित रूप से डेटा को "छुपा" कर सकते हैं, लेकिन हास्केल में यह डेटा उत्परिवर्तनीय नहीं है, इसलिए यह राज्य को छिपाता नहीं है। इसके विपरीत, मेरे अनुभव में जावा प्रोग्रामर अक्सर कहते हैं कि एक वर्ग उदाहरण "छुपा राज्य" उन मामलों में जहां प्रश्न में डेटा उत्परिवर्तनीय नहीं है, उदाहरण के लिए, कन्स्ट्रक्टर से private final
इंस्टेंस फ़ील्ड को असाइन किया गया है; उनका वास्तव में क्या मतलब है कि कक्षाएं (और बंद) डेटा encapsulate।
स्रोत
2012-02-23 19:36:53
जब चर वैधानिक पारदर्शिता तोड़ते हैं? गणित के रूप में यह पारदर्शी रूप से पारदर्शी है, फिर भी उन अजीब गणितज्ञ पूरे दिन चर लगते हैं। – delnan
कार्यान्वयन में राज्य शामिल हो सकता है, लेकिन अर्थात् बोलने पर कोई उत्परिवर्तन नहीं चल रहा है। –
हास्केल फ़ंक्शन में नि: शुल्क चर या तो अन्य कार्य, निरंतर आवेदक रूप या पहले से लागू तर्क (आंशिक अनुप्रयोग) हो सकते हैं, जिनमें से कुछ भी संदर्भित पारदर्शिता को तोड़ता है। – Vitus