2015-10-23 7 views
7

वहाँ स्रोत-कोड है कि another one of my questions के जवाब में जन्म लिया है का एक टुकड़ा है,हास्केल - क्या यह एक बंद है?

infFromPrefix :: Eq a => ([a] -> [a]) -> [a] -> [a] 
infFromPrefix rules prefix = inf where 
    inf = prefix ++ case stripPrefix prefix (rules inf) of 
     Just suffix -> suffix 
     Nothing  -> error "Substitution does not preserve prefix" 

जहां मैं बहुत यकीन है कि inf को बंद करने के रूप में यह अर्थ में इसका आवरण दायरे से चर की पहुंच है होना चाहिए कि यह infFromPrefix पर पारित पैरामीटर का उपयोग करता है, लेकिन अनिवार्य रूप से infFromPrefix और inf समान कार्य है, inf केवल को एक और संक्षिप्त परिभाषा की अनुमति देता है। एक बराबर परिभाषा

infFromPrefix rules prefix = prefix ++ case stripPrefix prefix (rules $ infFromPrefix rules prefix) of 
     Just suffix -> suffix 
     Nothing  -> error "Substitution does not preserve prefix" 

मैं सही हो सकता है, inf एक बंद है?

+0

मैं "नहीं" कहूंगा क्योंकि 'inf' कोई फ़ंक्शन नहीं है; यह एक सूची है। – melpomene

+5

@melpomene मुझे उत्सुक भाषाओं में लगता है कि कार्यों को बंद करने के लिए बंद करने के लिए यह समझ में आता है; आलसी भाषाओं में मैं इतना यकीन नहीं कर रहा हूँ। कम से कम मैं शर्त लगा सकता हूं कि जीएचसी की डेटा संरचना है, यह "बंद" कहती है जो कुछ स्तर पर 'inf' का प्रतिनिधित्व करने में शामिल है। –

+0

@melpomene आप सही हैं, अन्यथा नियम इसे इनपुट के रूप में स्वीकार नहीं करेंगे। चीयर्स। –

उत्तर

4

Closures in programming पर विकी लेख के आधार पर, मुझे लगता है कि यह कहा जा सकता है कि inf वास्तव में है नहीं एक बंद:

नोट विशेष रूप से है कि नेस्टेड समारोह परिभाषाओं खुद को बंद नहीं कर रहे हैं: वे एक नि: शुल्क है परिवर्तनीय, जो अभी तक बाध्य नहीं है। केवल एक बार जब संलग्नक पैरामीटर के मान के साथ संलग्न कार्य का मूल्यांकन किया जाता है, तो घोंसला वाले फ़ंक्शन के नि: शुल्क चर को बंद कर दिया जाता है, जो समापन कार्य से वापस लौटाया जाता है।

+0

मैं आपके साथ सहमत हूं, क्योंकि हास्केल आलसी है, सबकुछ बंद होने के रूप में देखा जा सकता है, क्योंकि बिना किसी तर्क के मूल्यांकन के लिए एक मूल्य के रूप में देखा जा सकता है (और इसलिए इसका मूल्यांकन होने तक इसके पर्यावरण को कैप्चर करना)। – mb14

+2

"[ए] एस भी एक तर्क के बिना एक समारोह के रूप में देखा जा सकता है।" नहीं वास्तव में कोई नहीं। –

10

मैं लेनार्ट और डैनियल से सहमत हूं कि बंद करना एक कार्यान्वयन-विशिष्ट शब्द है और सामान्य रूप से कुछ अच्छी तरह परिभाषित नहीं है। इसके अलावा, मैं Haskellers को कार्यान्वयन के मुद्दों के बाहर बहुत करीब बंद करने के बारे में बात नहीं सुनता; जब अन्य भाषाओं में प्रोग्रामर आकस्मिक रूप से "बंद" के बारे में बात करते हैं, तो आमतौर पर उनका मतलब है कि हम "लैम्बडास" कहलाते हैं। (जैसा कि "क्या उस भाषा में बंद हो गया है?"।)

वैसे भी, चलिए जीएचसी के बारे में बात करते हैं।

जीएचसी (या, अधिक सटीक, STG) किसी भी ढेर ऑब्जेक्ट को बंद करने के लिए कॉल करता है जो कि कन्स्ट्रक्टर एप्लिकेशन नहीं है।

(मामले में आप सोचते हैं कि यह एक व्यापक परिभाषा है, मूल STG कागज जहां भी कंस्ट्रक्टर्स बंद बुलाया गया के साथ इस की तुलना करें।)

आपका inf निश्चित रूप से एक एसटीजी बंद है, यह एक थक्का है जो ढेर पर आवंटित किया जाएगा और कॉलर पर लौटाया जाएगा।

+0

_ "कॉलर पर लौटा" _ - किस समारोह का कॉलर? 'inf' या' infFromPrefix'? मुझे यकीन नहीं है कि कैसे [विकिपीडिया बंद होने को परिभाषित करता है] के संदर्भ में अपना उत्तर कैसे दें [https://en.m.wikipedia.org/wiki/Closure_ (computer_programming))। –

+0

'infFromPrefix' ढेर पर एक बंद/थंक बनाता है, 'inf' और रिटर्न (पॉइंटर) को इसके ('infFromPrefix') कॉलर पर लौटाता है। कॉलर फिर आवश्यक डिग्री के मूल्यांकन के लिए बंद हो जाएगा। –

+2

@EricAllik शायद समस्या का हिस्सा यह है कि यहां लोग (और विकिपीडिया लेख में) स्थिर वस्तुओं के बीच अंतर के बारे में सावधान नहीं हैं - एक भाषा में वाक्यविन्यास के भाग - और गतिशील वस्तुओं - चीजें जो निर्मित और निरीक्षण की जाती हैं चलने के समय पर। यह कहने के लिए कि 'inf' स्वयं बंद नहीं है तकनीकी रूप से सही लगता है, क्योंकि यह एक स्थिर वस्तु है, और केवल गतिशील वस्तुओं को बंद किया जा सकता है; लेकिन कहने के लिए कि रनटाइम पर 'inf'romPrefix' कहलाता है तो अभिव्यक्ति' inf' को बंद कर दिया जाता है। –

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