Enum मॉड्यूल के सारे फंक्शन ईगर होते हैं। जब आप Enum मॉड्यूल से एन्युमरेबल पर एक के बाद एक कई ऑपरेशन करते हैं, तो हर ऑपरेशन एक बीच का परिणाम बनाता है।
Stream मॉड्यूल ईगर Enum मॉड्यूल का लेज़ी विकल्प है। इसमें Enum जैसे कई फंक्शन मिलते हैं, लेकिन यह बीच के परिणाम बनाने के बजाय गणनाओं की एक श्रृंखला बनाता है। ये गणनाएँ तभी चलती हैं जब स्ट्रीम को Enum मॉड्यूल के किसी फंक्शन को दिया जाता है।
स्ट्रीम एन्युमरेबल प्रोटोकॉल को लागू करती हैं, और इन्हें आपस में जोड़ा भी जा सकता है। एक के बाद एक जोड़कर आप इनसे और जटिल काम बना सकते हैं।
आप Numberphile Youtube चैनल के बहुत बड़े प्रशंसक हैं और आपने अभी-अभी लुकास संख्या अनुक्रम के बारे में एक मज़ेदार वीडियो देखा है। आप यह अनुक्रम Elixir की मदद से बनाना चाहते हैं।
अपना फंक्शन बनाते समय आप लेज़ी इवैल्युएशन का इस्तेमाल करना चाहते हैं, ताकि आप जितनी चाहें उतनी संख्याएँ बना सकें, मगर सिर्फ तब जब आपको उनकी ज़रूरत हो। इसलिए आप स्ट्रीम इस्तेमाल करने का फैसला करते हैं।
अगर अनुक्रम बनाने के लिए कोई ऐसी वैल्यू दी जाए जो पूर्णांक न हो, या 1 से छोटा पूर्णांक हो, तो एरर पैदा करने के लिए एक गार्ड क्लॉज़ जोड़िए। इसे पहले चरण में ही कर लेने से आगे के चरणों में अनंत रिकर्शन के बग नहीं आएँगे।
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
आप जानते हैं कि इस अनुक्रम की शुरुआत में दो संख्याएँ ऐसी हैं जो एक ही नियम का पालन नहीं करतीं। इन संख्याओं को लौटाने के लिए दो बेस केस क्लॉज़ लिखिए:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
2 से लंबे किसी भी अनुक्रम में अगली संख्या पाने के लिए पिछली दो संख्याओं को जोड़ना पड़ता है, और यही क्रम आगे भी चलता रहता है। अब सामान्यीकृत केस लिखिए।
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।