प्रोग्रामर्स हर दिन फंक्शन्स का सामना करते हैं। एक फ़ंक्शन एक विशेष प्रकार के संबंध का प्रतिनिधित्व करता है: फ़ंक्शन द्वारा लिया गया प्रत्येक इनपुट मान किसी आउटपुट मान से जुड़ा होता है। तो अधिक सामान्य तरीके से, एक फ़ंक्शन एक नियम है जो कुछ इनपुट मानों को एक आउटपुट मान पर मैप करता है।
शुरुआत करना
आइए गणितीय अवधारणा के साथ इस पर चर्चा करें। उपरोक्त आरेख में, "f" और "g" दो फ़ंक्शन हैं। हम फ़ंक्शंस को नीचे के रूप में दर्शा सकते हैं:
f: A -> B g: B -> C
यदि हम इन दो फ़ंक्शंस की कंपोजिशन करते हैं, तो हम इसे "g o f" के रूप में दर्शा सकते हैं (आप कह सकते हैं g of f)।
(g o f): A -> C ऐसे कि (g o f)(a) = g(f(a)) A में सभी a के लिए
आइए एक सरल उदाहरण के साथ इसे और अधिक एक्सप्लोर करें:
मान लें f(a) = 2a + 3 & g(a) = 3a + 5, तो फ़ंक्शन कंपोजिशन
(g o f)(a) = g(f(a)) = 3(f(a)) + 5 = 3(2a + 3) + 5 = 6a + 14
यह अवधारणा न केवल गणित में लागू होती है — हम इसे प्रोग्रामिंग भाषाओं में भी लागू कर सकते हैं। उन भाषाओं को फंक्शनल प्रोग्रामिंग भाषाएं कहा जाता है। इस अवधारणा को समझने से आपकी कोड पठनीयता में सुधार होता है और यह अन्य प्रोग्रामर्स के लिए समझना आसान हो जाता है।
Swift का परिचय एक फंक्शनल प्रोग्रामिंग भाषा के रूप में
अब, अच्छी खबर यह है कि Swift भी एक फंक्शनल प्रोग्रामिंग भाषा है। Swift प्रोग्रामिंग में, एक फ़ंक्शन की सबसे महत्वपूर्ण भूमिका होती है, इसलिए आप दैनिक रूप से उनके साथ इंटरैक्ट करेंगे। एक Swift फ़ंक्शन एक मान वापस कर सकता है, और फिर हम वापस किए गए मान को दूसरे फ़ंक्शन में इनपुट के रूप में उपयोग कर सकते हैं। यह एक सामान्य प्रोग्रामिंग अभ्यास है।
Swift में फ़ंक्शन कंपोजिशन लागू करना
मान लें हमारे पास पूर्णांकों की एक सरणी है, और हम चाहते हैं कि आउटपुट अद्वितीय सम पूर्णांकों की एक वर्ग सरणी हो। तो सामान्य रूप से, हम फ़ंक्शंस को नीचे की तरह लागू करेंगे:
यह कोड हमें सही आउटपुट देता है, लेकिन जैसा कि आप देख सकते हैं, कोड की पठनीयता अच्छी नहीं है। साथ ही, फ़ंक्शन कॉलिंग क्रम वैसा दिखता है जैसा हम चाहते हैं उसके विपरीत, और यह कुछ नए प्रोग्रामर्स के लिए भ्रम पैदा कर सकता है। कोड का यह ब्लॉक विश्लेषण करना कठिन है।
तो यहां फ़ंक्शन कंपोजिशन हमें उपरोक्त सभी समस्याओं से बचाने के लिए आता है। हम जेनेरिक्स, क्लोजर, और इन्फिक्स ऑपरेटर का लाभ उठाकर फ़ंक्शन कंपोजिशन प्राप्त कर सकते हैं।
तो आइए देखें कि उपरोक्त कोड ब्लॉक में क्या हो रहा है:
- हमने एक कस्टम इन्फिक्स ऑपरेटर ">>>" घोषित किया है। इसमें बाएं जुड़ाव और प्रीसिडेंस ऑर्डर है जैसे + ऑपरेटर।
- हमने एक फ़ंक्शन घोषित किया है जिसका नाम इन्फिक्स ऑपरेटर के नाम के समान है। फ़ंक्शन तीन जेनेरिक्स T, U, V का उपयोग करता है और दो क्लोजर को इनपुट पैरामीटर के रूप में लेता है।
- बायां पैरामीटर एक क्लोजर है, और यह T प्रकार का इनपुट लेता है और U प्रकार का आउटपुट लौटाता है।
- दायां पैरामीटर भी एक क्लोजर है, और यह U प्रकार का इनपुट लेता है और V प्रकार का आउटपुट लौटाता है।
- अब, >>> फ़ंक्शन एक फ़ंक्शन या क्लोजर लौटाता है, जिसका प्रकार (T) → V है। आउटपुट क्लोजर T प्रकार का इनपुट लेता है और V प्रकार का आउटपुट लौटाता है। यहां बाएं पैरामीटर का आउटपुट दाएं पैरामीटर का इनपुट है।
left : (T) -> U right: (U) -> V
आउटपुट प्रकार: (T) -> V
यदि आप फ़ंक्शन कंपोजिशन के गणितीय प्रतिनिधित्व को समझते हैं, तो आप देख सकते हैं कि यह Swift के कार्यान्वयन के साथ बिल्कुल समान है।
6. फ़ंक्शन बॉडी में, यह दाएं पैरामीटर का परिणाम बाएं पैरामीटर पर लौटाता है।
अब यदि हम वही परिणाम चाहते हैं (अद्वितीय सम पूर्णांकों की एक वर्ग सरणी), तो हम फ़ंक्शन कंपोजिशन के साथ ऐसा कर सकते हैं।
यह फ़ंक्शंस की एक श्रृंखला है जो वही परिणाम लौटाती है। फ़ंक्शन क्रम अब वैसा दिखता है जैसा एक इंसान सोच सकता है। इसकी पठनीयता बेहतर है और सभी के लिए समझना आसान है।
पढ़ने के लिए धन्यवाद!