मैं हास्केल के लिए नया हूं और जहां बनाम लेट हूं, वहां बहुत उलझन में हूं । वे दोनों एक समान उद्देश्य प्रदान करते हैं। मैंने जहां बनाम लेट के बीच कुछ तुलनाएं पढ़ी हैं, लेकिन प्रत्येक का उपयोग करते समय मुझे समझदारी से परेशानी हो रही है। क्या कोई कृपया कुछ संदर्भ या शायद कुछ उदाहरण प्रदान कर सकता है जो प्रदर्शित करता है कि कब एक का उपयोग करना है?
जहां बनाम
एक
where
खंड को केवल एक फ़ंक्शन परिभाषा के स्तर पर परिभाषित किया जा सकता है। आमतौर पर, यहlet
परिभाषा के दायरे के समान है । अंतर केवल तब है जब गार्ड्स का इस्तेमाल किया जा रहा है ।where
क्लॉज का दायरा सभी गार्डों पर फैला हुआ है। इसके विपरीत, एकlet
अभिव्यक्ति का दायरा केवल वर्तमान फ़ंक्शन क्लॉज और गार्ड है, यदि कोई हो।
हास्केल विकी बहुत विस्तृत है और विभिन्न मामलों प्रदान करता है, लेकिन यह काल्पनिक उदाहरण का उपयोग करता है। मुझे इसकी व्याख्याएँ एक शुरुआत के लिए बहुत संक्षिप्त लगती हैं।
लेट के लाभ :
f :: State s a
f = State $ \x -> y
where y = ... x ...
काम नहीं करेगा, क्योंकि जहां पैटर्न मिलान f = को संदर्भित करता है, जहां कोई एक्स गुंजाइश नहीं है। इसके विपरीत, अगर आपने शुरुआत की थी, तो आपको परेशानी नहीं होगी।
f :: State s a
f = State $ \x ->
let y = ... x ...
in y
कहाँ के लाभ :
f x
| cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
where
a = w x
f x
= let a = w x
in case () of
_ | cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
हास्केल विकी का उल्लेख है कि लेट अभिव्यक्ति अभिव्यंजक है , जहां क्लॉज घोषणात्मक है। शैली के अलावा वे अलग तरह से कैसे प्रदर्शन करते हैं?
Declaration style | Expression-style
--------------------------------------+---------------------------------------------
where clause | let expression
arguments LHS: f x = x*x | Lambda abstraction: f = \x -> x*x
Pattern matching: f [] = 0 | case expression: f xs = case xs of [] -> 0
Guards: f [x] | x>0 = 'a' | if expression: f [x] = if x>0 then 'a' else ...
- पहले उदाहरण में क्यों है चलो दायरे में लेकिन कहाँ नहीं है?
- क्या पहला उदाहरण कहां लागू करना संभव है ?
- क्या कुछ इसे वास्तविक उदाहरणों पर लागू कर सकते हैं जहां चर वास्तविक अभिव्यक्तियों का प्रतिनिधित्व करते हैं?
- क्या प्रत्येक का उपयोग करने के लिए अंगूठे का एक सामान्य नियम है?
अपडेट करें
उन लोगों के लिए जो बाद में इस धागे से आते हैं, मुझे यहां पाया जाने वाला सबसे अच्छा स्पष्टीकरण मिला: " ए जेंटल इंट्रोडक्शन टू हास्केल "।
भाव व्यक्त करते हैं।
जब भी बाइंडिंग के एक नेस्टेड सेट की आवश्यकता होती है, तो हास्केल के दो भाव उपयोगी होते हैं। एक साधारण उदाहरण के रूप में, विचार करें:
let y = a*b f x = (x+y)/y in f c + f d
लेट एक्सप्रेशन द्वारा बनाई गई बाइंडिंग का सेट परस्पर पुनरावर्ती है, और पैटर्न बाइंडिंग को आलसी पैटर्न के रूप में माना जाता है (यानी वे एक निहित ~ ले जाते हैं)। अनुमति के एकमात्र प्रकार प्रकार हस्ताक्षर, फ़ंक्शन बाइंडिंग और पैटर्न बाइंडिंग हैं।
जहां क्लॉस है।
कभी-कभी कई संरक्षित समीकरणों पर बाइंडिंग को गुंजाइश देना सुविधाजनक होता है, जिसके लिए एक खंड की आवश्यकता होती है:
f x y | y>z = ... | y==z = ... | y<z = ... where z = x*x
ध्यान दें कि यह एक लेट एक्सप्रेशन के साथ नहीं किया जा सकता है, जो केवल उस अभिव्यक्ति पर स्कोप करता है जो इसे संलग्न करता है। एक खंड जहां केवल समीकरणों या केस अभिव्यक्ति के सेट के शीर्ष स्तर पर अनुमति दी जाती है। उन भावों में बाइंडिंग पर समान गुण और बाधाएँ जहाँ क्लॉस में लागू होती हैं। नेस्टेड स्कोप के ये दो रूप बहुत समान लगते हैं, लेकिन याद रखें कि लेट एक्सप्रेशन एक एक्सप्रेशन है, जबकि क्लॉज नहीं है - यह फंक्शन डिक्लेरेशन और केस एक्सप्रेशन के सिंटैक्स का हिस्सा है।
f = body where x = xbody; y = ybody ...
अर्थ हैf = let x = xbody; y = ybody ... in body
case .... of ... where
किसी अभिव्यक्ति को किसी भी तरह से अभिव्यक्ति में बदलना संभव है ? मैं इस बारे में निश्चित नहीं हूँ।
let
औरwhere
जब मैंने पहली बार हास्केल सीखना शुरू किया। मुझे लगता है कि इसे समझने का सबसे अच्छा तरीका यह है कि यह महसूस किया जाए कि दोनों के बीच बहुत कम अंतर है, और इसलिए चिंता की कोई बात नहीं है। एक बहुत ही सरल यांत्रिक परिवर्तनwhere
केlet
माध्यम से दिए गए अर्थ । Haskell.org/onlinereport/decls.html#sect4.4.3.2 देखें । यह परिवर्तन केवल वाजिब सुविधा के लिए मौजूद है।