पैटर्न मैचिंग से हम अभिव्यंजक कोड लिख सकते हैं, जो अलग-अलग स्थितियों में अलग-अलग शाखाएँ लेता है, और डिस्ट्रक्चरिंग वैल्यू को वेरिएबल में बड़े सुंदर ढंग से बाँधती है।
case स्टेटमेंट की मदद से पैटर्न मैचिंग वैल्यू को वेरिएबल में बाँध सकती है, या फिर वाइल्डकार्ड _ से उन वैल्यू को छोड़ सकती है।
type Entity = Alien | Stranger (Maybe String) | Friend { name: String }
hello : Entity -> String
hello entity =
case entity of
-- Custom type variant
Alien -> "Hello, you are not from around here are you?"
-- Binding to a litteral value nested in Stranger
Stranger (Just nametag) -> "Hello, erm... " ++ nametag ++ "."
-- Discarding Friend's data
Friend _ -> "Hi!"
-- All other cases
_ -> "Hello stranger!"
जब डेटा के लिए एक ही आकार संभव हो, तब डिस्ट्रक्चरिंग से let बाइंडिंग में, फंक्शन के आर्गुमेंट में, और बेशक case एक्सप्रेशन में वैल्यू बाँधी जा सकती है।
pairSum : ( Int, Int ) -> Int
pairSum pair =
-- Destructuring of a pair in a 'let' binding
let ( x, y ) = pair
in x + y
-- Destructuring in the function argument
pairSum : ( Int, Int ) -> Int
pairSum ( x, y ) = x + y
-- Custom type containing a single variant
type Container = Box String
-- Destructuring in the function argument
unbox : Container -> String
unbox (Box str) = str
-- Destructuring combined with pattern matching
unboxMaybe : Maybe Container -> Maybe String
unboxMaybe maybeContainer =
case maybeContainer of
Nothing -> Nothing
Just (Box "42") -> Just "The answer to the universe!"
Just (Box str) -> Just str
डिस्ट्रक्चरिंग का इस्तेमाल रिकॉर्ड के लिए भी किया जा सकता है, या as कीवर्ड के साथ।
type alias Circle =
{ radius : Float
, center : ( Float, Float )
}
perimeter : Circle -> Float
perimeter { radius } =
2 * pi * radius
left : Circle -> Float
left { radius, center } =
-- the pair center cannot be pattern matched directly in the function argument
-- so we do it in a 'let' statement
let ( x, _ ) = center
in x - radius
-- using the 'as' keyword to bind both the fields and the whole record
smaller : Float -> Circle -> Circle
smaller reduction ({ radius } as circle) =
if reduction < radius then
{ circle | radius = radius - reduction }
else
circle
आप आईटी हेल्पडेस्क की टीम का हिस्सा हैं और अपने टिकटिंग सिस्टम को ज़्यादा कुशल बनाना चाहते हैं, ताकि यह तेज़ी से काम करे और आपकी मैनेजर के लिए आँकड़े भी दे सके।
हर टिकट का एक स्टेटस होता है (नया, प्रगति पर...), एक बनाने वाला होता है (जिसकी पहचान यूज़रनेम और कर्मचारी आईडी से होती है), उसे किसी आईटी कर्मचारी को असाइन किया जा सकता है, और उसमें टिप्पणियों का इतिहास रहता है।
यहाँ चार काम दिए गए हैं, जो आपके मौजूदा टिकटिंग सिस्टम को बेहतर बनाएँगे।
खाली टिप्पणियाँ इंटरफेस को भर देती हैं और कोई जानकारी नहीं देतीं। आप इन्हें छाँटकर हटाना चाहते हैं।
एक हेल्पर फंक्शन emptyComment बनाइए, जो यूज़र और टिप्पणी की जोड़ी लेता है और खाली टिप्पणियों के लिए True लौटाता है।
यूज़र और टिप्पणी को सीधे फंक्शन के आर्गुमेंट में निकालने के लिए डीस्ट्रक्चरिंग का इस्तेमाल कीजिए। यूज़र को अनदेखा कीजिए, क्योंकि आपको उस जानकारी की ज़रूरत नहीं है।
emptyComment ( User "Alice", "" )
-- => True
आपकी मैनेजर टिकट प्रक्रिया में यूज़र की भागीदारी के आँकड़े चाहती हैं। वे आपसे जाँचने को कहती हैं कि टिकट बनाने वाले ने कितनी टिप्पणियाँ जोड़ी हैं।
numberOfCreatorComments बनाइए, जो एक टिकट लेता है और टिकट बनाने वाले की जोड़ी गई टिप्पणियों की संख्या लौटाता है।
फंक्शन के आर्गुमेंट में डीस्ट्रक्चरिंग का इस्तेमाल करके Ticket टाइप से रिकॉर्ड निकालिए, और साथ ही रिकॉर्ड से अपने ज़रूरी फील्ड भी निकालिए।
इसके बाद createdBy को एक let बाइंडिंग में डीस्ट्रक्चर कीजिए, ताकि आप संबंधित टिप्पणियाँ गिन सकें।
गिनती करने के लिए List के फंक्शन इस्तेमाल कीजिए, और एनोनिमस फंक्शन के आर्गुमेंट में डीस्ट्रक्चरिंग का इस्तेमाल करके यूज़र और टिप्पणी की जोड़ी अलग कीजिए।
numberOfCreatorComments
numberOfCreatorComments
(Ticket
{ status = Closed
, createdBy = ( User "Chiaki", 1 )
, assignedTo = Nothing
, comments = [ ( User "Chiaki", "Never mind, fixed it." ) ]
}
)
-- => 1
कुछ टिकट डेव टीम के Alice, Bob या Charlie तक भेजने पड़ते हैं। ऐसे टिकटों पर नज़र रखना ज़रूरी है, ताकि पक्का किया जा सके कि उन पर काम आगे बढ़ रहा है।
एक हेल्पर फंक्शन assignedToDevTeam बनाइए, जो जाँचता है कि कोई टिकट डेव टीम के किसी सदस्य को असाइन किया गया है या नहीं।
फंक्शन के आर्गुमेंट में डीस्ट्रक्चरिंग का इस्तेमाल करके Ticket टाइप से रिकॉर्ड और अपना ज़रूरी फील्ड निकालिए।
इसके बाद एक ही case स्टेटमेंट से जाँचिए कि टिकट Alice, Bob या Charlie को असाइन है या नहीं, जिसमें रिकर्सिव पैटर्न मैचिंग से उनके यूज़रनेम निकालिए और लिटरल पैटर्न मैचिंग से उन्हें मैच कीजिए।
assignedToDevTeam
(Ticket
{ status = InProgress
, createdBy = ( User "Bill", 2 )
, assignedTo = Just (User "Alice")
, comments = [ ( User "Bill", "What's an 'undefined'?" ) ]
}
)
-- => True
कभी-कभी कई सारे टिकट दूसरे आईटी कर्मचारियों को दोबारा असाइन करने पड़ते हैं।
इसमें मदद के लिए एक फंक्शन assignTicketTo बनाइए। यह फंक्शन दो आर्गुमेंट लेता है: वह यूज़र, जिसे टिकट असाइन करना है, और एक टिकट।
अगर टिकट का स्टेटस New है, तो उसे नए यूज़र को असाइन कीजिए और स्टेटस बदलकर InProgress कर दीजिए।
बाकी स्टेटस के लिए टिकट को बस नए यूज़र को दोबारा असाइन कर दीजिए, लेकिन Archived स्टेटस वाले टिकटों को बिल्कुल भी नहीं बदलना चाहिए।
फंक्शन के आर्गुमेंट में डीस्ट्रक्चरिंग का इस्तेमाल करके Ticket टाइप से रिकॉर्ड और अपना ज़रूरी फील्ड निकालिए, और as कीवर्ड से पूरा रिकॉर्ड जैसा है वैसा ही पकड़िए।
एक ही case स्टेटमेंट से स्टेटस पर पैटर्न मैचिंग कीजिए और उचित टिकट लौटाइए, जो as कीवर्ड से पकड़े गए मूल रिकॉर्ड में बदलाव करके बनाया गया हो।
assignTicketTo (User "Danny")
(Ticket
{ status = New
, createdBy = ( User "Jesse", 3 )
, assignedTo = Just (User "Alice")
, comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
}
)
-- => Ticket
-- { status = InProgress
-- , createdBy = ( User "Jesse", 3 )
-- , assignedTo = Just (User "Danny")
-- , comments = [ ( User "Jesse", "I've been waiting for 6 months!!" ) ]
-- }
Exercism पर साइन अप कीजिए और Elm को 28 कॉन्सेप्ट110 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।