ट्रैक
/
F#
F#
/
सिलेबस
/
पैटर्न मैचिंग
पै

पैटर्न मैचिंग में F#

1 अभ्यास

पैटर्न मैचिंग के बारे में

किसी लॉजिक को शर्त के अनुसार चलाने के लिए if/elif/else एक्सप्रेशन का उपयोग किया जा सकता है। F# में लॉजिक को शर्त के अनुसार चलाने का एक और, ज़्यादा शक्तिशाली तरीका भी है: पैटर्न मैचिंग। पैटर्न मैचिंग की मदद से किसी वैल्यू को एक या अधिक पैटर्न के सामने परखा जा सकता है। ऐसे पैटर्न का एक उदाहरण कॉन्स्टेंट पैटर्न है, जो किसी वैल्यू को एक कॉन्स्टेंट (जैसे 1 या "hello") से मिलाता है।

F# में पैटर्न मैचिंग match कीवर्ड के ज़रिए की जाती है:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

यह दूसरी भाषाओं के switch स्टेटमेंट जैसा लग सकता है, लेकिन जब दूसरे पैटर्न भी इस्तेमाल किए जाते हैं, तभी पैटर्न मैचिंग की असली शक्ति दिखती है। ऐसा ही एक पैटर्न वेरिएबल पैटर्न है, जिससे किसी वैल्यू को पकड़ा जा सकता है:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

कुछ मामलों में आप किसी पैटर्न में एक अतिरिक्त शर्त जोड़ना चाह सकते हैं। इसे गार्ड (क्लॉज़) कहते हैं, जिसे when कीवर्ड की मदद से जोड़ा जा सकता है:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

गार्ड क्लॉज़ कोई भी मान्य एक्सप्रेशन हो सकता है, जिसमें फंक्शन कॉल करना भी शामिल है।

ऊपर के उदाहरण में हर संभावित इनपुट के लिए मैच करता हुआ पैटर्न मौजूद नहीं है। कंपाइलर इसे पहचान लेगा और एक चेतावनी देगा। इसे एक्ज़ॉस्टिव मैचिंग कहते हैं। चेतावनी दूर करने के लिए सभी मामलों को संभालना पड़ता है। इसके लिए [वाइल्डकार्ड पैटर्न][wildcard-pattern] इस्तेमाल किया जा सकता है, जो किसी भी वैल्यू से मैच करने वाला पैटर्न है:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

ध्यान दीजिए कि कंपाइलर when क्लॉज़ से यह नहीं समझ सकता कि सभी मामले कवर हो गए हैं या नहीं:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

पैटर्न मैचिंग किसी वैल्यू की जाँच ऊपर से नीचे तक हर पैटर्न के सामने करती है, जब तक कि उसे कोई मैच करता हुआ पैटर्न न मिल जाए और वह उस पैटर्न से जुड़ा लॉजिक न चला दे। पैटर्न का क्रम मायने रखता है! इसलिए डिस्कार्ड पैटर्न को match एक्सप्रेशन में हमेशा अंत में आना चाहिए।

पैटर्न मैचिंग बहुत शक्तिशाली है, लेकिन सरल शर्त वाले लॉजिक को आम तौर पर if/else एक्सप्रेशन से ज़्यादा साफ़ तरीके से लिखा जा सकता है:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

पैटर्न मैचिंग सीखिए