ट्रैक
/
Elm
Elm
/
अभ्यास
/
खज़ाने का संदूक
खज़ाने का संदूक

खज़ाने का संदूक

सीखने का अभ्यास

परिचय

जेनेरिक्स

परिचय

जेनेरिक्स भाषा का एक फीचर है जो कोड का दोबारा उपयोग संभव बनाता है। उदाहरण के लिए, किसी ऐरे में किस टाइप की वैल्यू हैं, इससे ऐरे की लंबाई निकालने में फर्क नहीं पड़ना चाहिए। इसीलिए length फंक्शन अपने टाइप सिग्नेचर में एक जेनेरिक टाइप पैरामीटर a इस्तेमाल करता है।

length : List a -> Int

टाइपों में पैरामीटर

जब एक टाइप किसी दूसरे टाइप पर जेनेरिक होता है, तो उस दूसरे टाइप के लिए हम छोटे अक्षरों वाला नाम इस्तेमाल करते हैं और उसे टाइप पैरामीटर कहते हैं। आम उदाहरण List, Maybe और Result कस्टम टाइप हैं।

-- Maybe is generic over the type a
type Maybe a
    = Nothing
    | Just a

someString : Maybe String
someString = Just "hello"

someInt : Maybe Int
someInt = Just 42

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

एक टाइप कई अन्य टाइपों पर जेनेरिक हो सकता है, और इस तरह उसके कई टाइप पैरामीटर हो सकते हैं। ऐसी स्थिति में हर स्वतंत्र टाइप को अलग छोटे अक्षरों वाला नाम मिलता है। स्वतंत्र होना उन्हें एक ही टाइप बनने से नहीं रोकता, यह बस उन्हें अलग होने की सुविधा देता है।

-- Result is generic over the types error and value
type Result error value
    = Ok value
    | Err error

रिकॉर्ड टाइप एलियस में भी टाइप पैरामीटर हो सकते हैं, हालाँकि यह कम आम है।

-- Event is generic over the type a
type alias Event a =
    { at : Time
    , data : a 
    }

फंक्शनों में टाइप पैरामीटर

चूँकि टाइप जेनेरिक हो सकते हैं, इसलिए फंक्शन भी जेनेरिक हो सकते हैं। जेनेरिक टाइपों को संभालने वाले फंक्शन लिखे जा सकते हैं, जैसे Maybe.withDefault।

withDefault : a -> Maybe a -> a
withDefault default maybe =
    case maybe of
      Just value -> value
      Nothing -> default

जो फंक्शन दूसरे फंक्शनों को पैरामीटर के रूप में लेते हैं, उन्हें हायर ऑर्डर फंक्शन कहा जाता है, और ये भी जेनेरिक हो सकते हैं।

map : (a -> b) -> Maybe a -> Maybe b
map function maybe =
  case maybe of
    Just value ->
      Just (function value)

    Nothing ->
      Nothing

निर्देश

इस अभ्यास में आप एक जेनेरिक (या कहिए, जादुई!) TreasureChest बनाएँगे, जिसमें थोड़ा-सा खज़ाना संग्रहीत किया जाएगा।

1. TreasureChest जेनेरिक कस्टम टाइप बनाइए

एक TreasureChest कस्टम टाइप बनाइए, जिसमें सिर्फ एक वेरिएंट हो।

इस वेरिएंट में एक जुड़ी हुई String वैल्यू होनी चाहिए, जिसका उपयोग खज़ाने के संदूक का पासवर्ड संग्रहीत करने के लिए किया जाएगा।

इस वेरिएंट में एक जुड़ी हुई जेनेरिक वैल्यू भी होनी चाहिए, जिसमें खज़ाना संग्रहीत किया जाएगा। यह वैल्यू जेनेरिक है, ताकि खज़ाना कुछ भी हो सके।

2. getTreasure फंक्शन बनाइए

इस फंक्शन को दो पैरामीटर लेने चाहिए

  • एक String (पासवर्ड आज़माने के लिए)
  • एक TreasureChest जेनेरिक कस्टम टाइप

इस फंक्शन को दिए गए पासवर्ड-प्रयास को TreasureChest की String से मिलाकर जाँचना चाहिए।

इस फंक्शन को एक Maybe लौटाना चाहिए।

अगर पासवर्ड मेल खाते हैं, तो TreasureChest की जेनेरिक वैल्यू (यानी खज़ाना!) के साथ Just लौटाइए।

अगर पासवर्ड मेल नहीं खाते, तो Nothing लौटाइए।

3. multiplyTreasure फंक्शन बनाइए

इस (हायर ऑर्डर) फंक्शन को दो पैरामीटर लेने चाहिए

  • एक मल्टीप्लायर फंक्शन, जो एक जेनेरिक पैरामीटर लेता है और उसी जेनेरिक टाइप का एक ऐरे लौटाता है
  • एक TreasureChest जेनेरिक कस्टम टाइप, जिसमें भी वही जेनेरिक टाइप हो

इस फंक्शन को संदूक में रखे खज़ाने के साथ मल्टीप्लायर फंक्शन को कॉल करना चाहिए।

इस फंक्शन को एक नया TreasureChest लौटाना चाहिए, जिसमें पहले वाले जैसा ही पासवर्ड हो और जिसमें गुणा किया गया खज़ाना (यानी मल्टीप्लायर फंक्शन की रिटर्न वैल्यू) हो।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elm Exercism

खज़ाने का संदूक शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Elm को 28 कॉन्सेप्ट110 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।