2012-01-31 19 views
13

मेरे लिए एक क्लोजर सह-स्थित डेटा के साथ एक (नेस्टेड?) फ़ंक्शन है।क्लोजर (हास्केल में)

जब आप हास्केल में सॉफ़्टवेयर लिखते हैं और बाद में इसे देखते हैं, तो आप अक्सर अनजाने में बनाए गए बंद को ढूंढते हैं।

मुझे अपने लिए यह अधिकार बिल्कुल सही नहीं है। मैं किस स्थिति में जानबूझ कर बंद करना चाहता हूं? आखिरकार, सभी उदाहरणों में मुझे लगता है कि सह-स्थित डेटा की मात्रा मामूली/छोटी है और इस प्रकार यह मुझे प्रतीत नहीं होता है जैसे कि अभ्यास में जो कभी भी (जानबूझकर) सृजन को औचित्य साबित कर देगा। क्या कोई हास्केल मॉड्यूल है जो जानबूझकर बंद करने और उदा। उन्हें मानचित्र में संग्रहीत करना?

+4

दिलचस्प सवाल ... अनजाने में बनाए गए बंदियों से आपका क्या मतलब है? –

+0

@ जोनाथन स्टर्लिंग ज्यादातर जब आप नेस्टेड फ़ंक्शंस बनाते हैं। आम तौर पर वे "बंद" –

+0

कहलाए जाने वाले मानदंडों को पूरा करते हैं क्योंकि dflemstr बताते हैं कि आप हर समय "बंद" बना रहे हैं। यह हैकेल में नाम रखने के लिए एक अवधारणा भी नहीं है। क्या आप करी और आंशिक अनुप्रयोग को समझते हैं, और कैसे प्रकार हस्ताक्षर 'Int -> Int -> Int'' Int -> (Int -> Int) 'के बराबर है? – jberryman

उत्तर

25

हास्केल में, फ़ंक्शन भाषा का एक अनिवार्य हिस्सा हैं, मुख्य रूप से हैस्केल Lambda Calculus पर आधारित है।

लैम्ब्डा कैलकुस में, ऐसे फ़ंक्शन हैं जिनमें "मुक्त चर" हैं, जिसका अर्थ है कि वे चर का उपयोग करते हैं जो उन्हें प्रत्यक्ष पैरामीटर के रूप में पारित नहीं किया गया था। मुक्त चर के साथ कार्य वे हैं जो आप इस मामले में "बंद" कहते हैं।

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

f a b = \ c -> a * b + c 

... या यहाँ तक कि:

f a b c = a * b + c 

... आप भी इस सटीक एक ही परिणाम के साथ लेखन किया जा सकता है,

f a b = let product = a * b in \ c -> product + c 

... आगे समकक्ष परिवर्तन:

f a = \ b -> let product = a * b in \ c -> product + c 

ऐसा इसलिए है क्योंकि हास्केल अनिवार्य रूप से मुक्त चर हर जगह के साथ फ़ंक्शन बनाता है, और इस प्रकार, बंद हर समय बनाए जाते हैं। इनमें से कुछ को संकलक द्वारा अनुकूलित किया जा सकता है, लेकिन यह मानना ​​सुरक्षित है कि आपके द्वारा कभी भी खोजने में सक्षम होने के मुकाबले अधिक बंद हो जाएगा।

तो, बंद करने का पता लगाने की कोशिश न करें; वे हास्केल में कुछ खास नहीं हैं और हर समय इस्तेमाल होते हैं।

+0

सभी समझ गए। फिर भी मुझे यह स्पष्ट नहीं है: क्या मैं हास्केल (ए) में जानबूझ कर बंद कर सकता हूं और (बी) उन्हें मानचित्र में स्टोर कर सकता हूं और (सी) बिना किसी झगड़े के उन्हें क्रमबद्ध कर सकता हूं जैसे कि मैं erlang में term_to_binary() के साथ कर सकता हूं? –

+0

@JFritsch, आप आसानी से मानचित्र में फ़ंक्शंस स्टोर कर सकते हैं, और "जानबूझकर बंद करने" के बारे में; हास्केल के पास बंद होने और सामान्य कार्यों के बीच कोई भेद नहीं है, इसलिए मानचित्र में सामान्य कार्यों को संग्रहीत करना उतना ही आसान है। हालांकि, कार्यों को क्रमबद्ध करना बहुत मुश्किल है, और इसके लिए जीएचसी में कुछ प्रयोगात्मक समर्थन होने के बावजूद, इसे अभी तक करने का कोई विश्वसनीय तरीका नहीं है। याद रखें कि वेरिएबल्स उदा। फ़ाइल हैंडल, और यदि एक बंदरगाह इस तरह के चर पर निर्भर करता है, तो आप वास्तव में इसे थोड़ा स्ट्रीम में परिवर्तित नहीं कर सकते हैं। – dflemstr

+0

तो मैं अपने परिणामस्वरूप मानचित्र को Data.Binary के साथ क्रमबद्ध करने में सक्षम नहीं होगा? –

3

आमतौर पर, यदि मुझे किसी फ़ंक्शन के लिए टेबल या कुछ प्रीकंप्यूट करने की आवश्यकता है, या ऐसे फ़ंक्शन के लिए बहुत सारे डेटा की आवश्यकता है, हाँ, यह बंद होने के रूप में किया जाएगा। उदाहरण के लिए, दूसरे दिन मेरे एआई होमवर्क पर, मैंने एक ऐसी चीज लिखी जो कई नमूनों से सीखा और फिर (Point -> Bool) फ़ंक्शन को पॉप आउट किया, लेकिन उस फ़ंक्शन को बहुत से डेटा पर निर्भर होना था जिसे मैं सीखने की प्रक्रिया से जमा करता था ।

+0

क्या आप कुछ और नमूना कोड पोस्ट कर सकते हैं? –