यहां सामान को परिभाषित करने के तीन समान (लेकिन अलग) तरीके हैं:
आप कुछ परिभाषाओं के बाद where
खंड संलग्न कर सकते हैं - ज्यादातर समीकरण शैली बाइंडिंग । तो आप अपने फ़ंक्शन के अंत में, या let
या आसपास के where
खंड के साथ परिभाषित कुछ के बाद डाल सकते हैं।
दूसरी ओर, let x = ... in ...
एक अभिव्यक्ति कि in
के बाद वाले हिस्से का मूल्यांकन है, जो केवल जगह let
के बाद सामान दिख रहा है है।
एक do
ब्लॉक के अंदर, पहले से ही है क्योंकि इस बात की गुंजाइश एक अंतर्निहित घोंसले (चीजें दिखाई के बाद वे पहली बार परिभाषित कर रहे हैं), तो आप सिर्फ let x = ...
अकेले उपयोग कर सकते हैं। यह वास्तव में पिछले रूप जैसा ही है - शेष do
let
के बाद ब्लॉक प्रभावी ढंग से in ...
भाग है।
आप एक स्थानीय परिभाषा कुछ do
ब्लॉक के भीतर परिभाषित का उपयोग करता है चाहते हैं, अपने एकमात्र विकल्प तिहाई (या तर्क (रों) के रूप में अन्य मूल्य (रों) गुजर रहा है)। आपके उदाहरण की तरह एक स्वतंत्र सहायक कार्यों के लिए, हालांकि, कोई भी शैली काम करती है।यहाँ अपने उदाहरण है, प्रत्येक प्रदर्शित करने के लिए:
पहली शैली है, जहां func
foo
में कहीं भी दिखाई दे रहा है, कुछ और where
खंड में परिभाषित किया जिनमें शामिल हैं:
foo = do ...
mapM_ func aList
...
return aValue
where func x = x + 1
दूसरी शैली है, जहां func
अंदर ही दिखाई दे रहा है let
अभिव्यक्ति, जो इस मामले में पूरे do
ब्लॉक है:
foo = let func x = x + 1
in do
...
mapM_ func aList
...
return aValue
और तीसरा शैली को परिभाषित यह do
ब्लॉक के अंदर है। इस मामले में, func
केवल let
के बाद दिखाई देता है; पहले ...
में इसे अभी तक परिभाषित नहीं किया गया है।
foo = do ...
let func x = x + 1
mapM_ func aList
...
return aValue
ओह, और अच्छा उपाय: चूंकि let ... in ...
एक अभिव्यक्ति है, आप भी उपयोग कर सकते हैं कहीं भी आप एक अभिव्यक्ति है, कुछ स्थानीय परिभाषाओं नाम है। तो यहाँ एक और उदाहरण है:
foo = do ...
let func x = x + 1 in mapM_ func aList
...
return aValue
पहले की तरह, func
let
अभिव्यक्ति है, जो इस मामले में यह एक के बाद अभिव्यक्ति, और कहीं नहीं है के अंदर ही दिख रहा है।
स्रोत
2012-12-30 17:44:59
धन्यवाद। तीसरा रूप ऐसा लगता है कि यह मुझे उपयोगी होने के लिए 'mapM_' के लिए पर्याप्त लैम्ब्डा फ़ंक्शन को परिभाषित करने की अनुमति देगा। मुझे केवल चिंता है कि यह 'लेट' (मामूली समस्या) में परिभाषित 'func' नाम के साथ शीर्ष-स्तरीय फ़ंक्शन नेमस्पेस को प्रदूषित करता है। – Ralph
@ राल्फ: ठीक है, यह सिर्फ एक बात है कि आप किस क्षेत्र में दिखाना चाहते हैं। यदि आपका 'ऐसा' ब्लॉक इतना बड़ा है कि आपको इसके अंदर नामस्थान को प्रदूषित करने की चिंता करने की ज़रूरत है, तो आपको शायद इसे छोटे टुकड़ों में तोड़ने पर विचार करना चाहिए । :] –
हाँ, यह भी मेरे साथ हुआ था। मैं कुछ कार्यात्मक स्कैला कोड का अनुवाद कर रहा हूं कि कुछ बेवकूफों ने (:-)) उन कार्यों के साथ लिखा जो उनके होने से अधिक लंबे समय तक हैं। – Ralph