खोज…


0-ट्यूपल क्या अच्छा है?

2-ट्यूपल या 3-ट्यूपल संबंधित वस्तुओं के एक समूह का प्रतिनिधित्व करते हैं। (2 डी अंतरिक्ष में अंक, एक रंग के आरजीबी मान, आदि) 1-ट्यूपल बहुत उपयोगी नहीं है क्योंकि इसे आसानी से एक एकल int साथ बदला जा सकता है।

0-ट्यूपल और भी बेकार लगता है क्योंकि इसमें बिल्कुल कुछ नहीं होता है । फिर भी इसमें ऐसे गुण हैं जो इसे F # जैसी कार्यात्मक भाषाओं में बहुत उपयोगी बनाते हैं। उदाहरण के लिए, 0-टपल प्रकार का एक मूल्य है, जिसे आमतौर पर () रूप में दर्शाया जाता है। सभी 0-टुपल्स का यह मूल्य है इसलिए यह अनिवार्य रूप से एक सिंगलटन प्रकार है। F # सहित अधिकांश कार्यात्मक प्रोग्रामिंग भाषाओं में, इसे unit प्रकार कहा जाता है।

C # में void लौटाने वाले फ़ंक्शंस F # में unit प्रकार लौटाएंगे:

let printResult = printfn "Hello"

F # इंटरैक्टिव दुभाषिया में चलाएं, और आप देखेंगे:

val printResult : unit = ()

इसका मतलब यह है कि वैल्यू printResult टाइप unit , और इसमें वैल्यू () (खाली ट्यूपल, unit टाइप का एक और एकमात्र वैल्यू) है।

कार्य एक पैरामीटर के रूप में unit प्रकार भी ले सकते हैं। F # में, फ़ंक्शन ऐसा लग सकता है कि वे कोई पैरामीटर नहीं ले रहे हैं। लेकिन वास्तव में, वे टाइप unit का एक ही पैरामीटर ले रहे हैं। यह समारोह:

let doMath() = 2 + 4

वास्तव में इसके बराबर है:

let doMath () = 2 + 4

अर्थात्, एक फ़ंक्शन जो टाइप unit एक पैरामीटर को लेता है और int वैल्यू को वापस लौटाता है। 6. यदि आप उस प्रकार के हस्ताक्षर को देखते हैं जो इस फ़ंक्शन को परिभाषित करते समय F # इंटरैक्टिव इंटरप्रेटर प्रिंट करता है, तो आप देखेंगे:

val doMath : unit -> int

तथ्य यह है कि सभी फ़ंक्शन कम से कम एक पैरामीटर लेंगे और एक मान लौटाएंगे, भले ही वह मूल्य कभी-कभी "बेकार" मान की तरह हो () , का अर्थ है कि फ़ंक्शन रचना उन भाषाओं की तुलना में एफ # में बहुत आसान है, जिनमें सबसे अधिक नहीं है unit प्रकार। लेकिन यह एक अधिक उन्नत विषय है जिसे हम बाद में प्राप्त करेंगे। अभी के लिए, बस याद रखें कि जब आप एक फ़ंक्शन सिग्नेचर में unit देखते हैं, या () एक फंक्शन के मापदंडों में, यह 0-टपल प्रकार है जो यह कहने का तरीका है कि "यह फ़ंक्शन लेता है, या रिटर्न करता है, कोई सार्थक मान नहीं।"

कोड का निष्पादन ज्ञात करें

हम कार्यों को परिभाषित करने के लिए एक फ़ंक्शन तर्क के रूप में unit प्रकार का उपयोग कर सकते हैं जिसे हम बाद तक निष्पादित नहीं करना चाहते हैं। यह अक्सर अतुल्यकालिक पृष्ठभूमि कार्यों में उपयोगी होता है, जब मुख्य धागा पृष्ठभूमि थ्रेड की कुछ पूर्वनिर्धारित कार्यक्षमता को ट्रिगर करना चाहता हो सकता है, जैसे कि शायद इसे एक नई फ़ाइल पर ले जाना, या यदि आ-बाध्यकारी तुरंत नहीं चलाया जाना चाहिए:

module Time =
    let now = System.DateTime.Now   // value is set and fixed for duration of program
    let now() = System.DateTime.Now // value is calculated when function is called (each time)

निम्नलिखित कोड में, हम एक "कार्यकर्ता" को शुरू करने के लिए कोड को परिभाषित करते हैं जो हर 2 सेकंड पर काम कर रहे मूल्य को प्रिंट करता है। कार्यकर्ता फिर दो कार्यों को लौटाता है जो इसे नियंत्रित करने के लिए इस्तेमाल किया जा सकता है - एक जो इसे काम करने के लिए अगले मूल्य पर ले जाता है, और एक जो इसे काम करने से रोकता है। ये कार्य होने चाहिए, क्योंकि हम नहीं चाहते कि उनके शरीर को तब तक क्रियान्वित किया जाए, जब तक हम चुनते नहीं हैं, अन्यथा कार्यकर्ता तुरंत दूसरे मूल्य पर चले जाएंगे और बिना कुछ किए बंद कर देंगे।

let startWorker value =
    let current = ref value
    let stop = ref false
    let nextValue () = current := !current + 1
    let stopOnNextTick () = stop := true
    let rec loop () = async {
        if !stop then
            printfn "Stopping work."
            return ()
        else
            printfn "Working on %d." !current
            do! Async.Sleep 2000
            return! loop () }
    Async.Start (loop ())
    nextValue, stopOnNextTick

हम तब कर के एक कार्यकर्ता शुरू कर सकते हैं

let nextValue, stopOnNextTick = startWorker 12

और काम शुरू हो जाएगा - अगर हम एफ # इंटरएक्टिव हैं, तो हम कंसोल में छपे संदेशों को हर दो सेकंड में देखेंगे। हम तो चला सकते हैं

nextValue ()

और हम उन संदेशों को इंगित करते हुए देखेंगे कि जिस मूल्य पर काम किया जा रहा है वह अगले एक पर चला गया है।

जब काम खत्म होने का समय हो, हम दौड़ सकते हैं

stopOnNextTick ()

फ़ंक्शन, जो समापन संदेश को प्रिंट करेगा, फिर बाहर निकल जाएगा।

"कोई इनपुट नहीं" को इंगित करने के लिए unit प्रकार यहां महत्वपूर्ण है - फ़ंक्शन में पहले से ही सभी जानकारी है जो उन्हें उनमें निर्मित काम करने की आवश्यकता है, और कॉलर को इसे बदलने की अनुमति नहीं है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow