कार्यात्मक प्रोग्रामिंग में कई अलग-अलग तकनीकें शामिल हैं। साइड इफेक्ट के साथ कुछ तकनीक ठीक हैं। लेकिन एक महत्वपूर्ण पहलू समान तर्क है : यदि मैं एक ही मूल्य पर एक फ़ंक्शन कहता हूं, तो मुझे हमेशा एक ही परिणाम मिलता है। इसलिए मैं रिटर्न वैल्यू के साथ एक फ़ंक्शन कॉल को स्थानापन्न कर सकता हूं, और समान व्यवहार प्राप्त कर सकता हूं। इससे प्रोग्राम के बारे में तर्क करना आसान हो जाता है, खासकर जब डिबगिंग।
फ़ंक्शन के साइड इफेक्ट्स होने चाहिए, यह काफी पकड़ नहीं है। रिटर्न वैल्यू फंक्शन कॉल के बराबर नहीं है, क्योंकि रिटर्न वैल्यू में साइड इफेक्ट्स नहीं होते हैं।
इसका समाधान साइड इफेक्ट्स का उपयोग बंद करना है और इन प्रभावों को रिटर्न वैल्यू में एन्कोडिंग करना है । विभिन्न भाषाओं में अलग-अलग प्रभाव प्रणालियाँ होती हैं। ईजी हास्केल कुछ प्रभाव जैसे कि आईओ या स्टेट म्यूटेशन को एनकोड करने के लिए मोनाड्स का उपयोग करता है। C / C ++ / Rust भाषाओं में एक प्रकार की प्रणाली होती है जो कुछ मूल्यों के उत्परिवर्तन को रोक सकती है।
अनिवार्य भाषा में, एक print("foo")
फ़ंक्शन कुछ प्रिंट करेगा और कुछ भी नहीं लौटाएगा। हास्केल जैसी शुद्ध कार्यात्मक भाषा में, एक print
फ़ंक्शन बाहरी दुनिया की स्थिति का प्रतिनिधित्व करने वाली एक वस्तु भी लेता है, और इस आउटपुट का प्रदर्शन करने के बाद एक नई वस्तु को राज्य का प्रतिनिधित्व करता है। के समान कुछ newState = print "foo" oldState
। मैं पुराने राज्य से जितने चाहे नए राज्य बना सकता हूं। हालांकि, मुख्य फ़ंक्शन द्वारा केवल एक का उपयोग किया जाएगा। इसलिए मुझे कार्यों को पूरा करके राज्यों को कई कार्यों से अनुक्रम करने की आवश्यकता है। प्रिंट करने के लिए foo bar
, मैं कुछ ऐसा कह सकता हूं print "bar" (print "foo" originalState)
।
यदि कोई आउटपुट स्थिति का उपयोग नहीं किया जाता है, तो हास्केल उस स्थिति तक नहीं जाता है, क्योंकि यह एक आलसी भाषा है। इसके विपरीत, यह आलस्य केवल इसलिए संभव है क्योंकि सभी प्रभाव रिटर्न मान के रूप में स्पष्ट रूप से एन्कोड किए गए हैं।
ध्यान दें कि हास्केल एकमात्र सामान्य रूप से प्रयुक्त कार्यात्मक भाषा है जो इस मार्ग का उपयोग करती है। अन्य कार्यात्मक भाषाएं। लिस्प परिवार, एमएल परिवार और नई कार्यात्मक भाषाएँ जैसे स्काला हतोत्साहित करती हैं लेकिन फिर भी दुष्प्रभाव की अनुमति देती हैं - उन्हें अनिवार्य-कार्यात्मक भाषा कहा जा सकता है।
I / O के लिए साइड इफेक्ट्स का उपयोग करना शायद ठीक है। अक्सर, I / O (लॉगिंग के अलावा) केवल आपके सिस्टम की बाहरी सीमा पर किया जाता है। आपके व्यावसायिक तर्क के भीतर कोई बाहरी संचार नहीं होता है। फिर अपने सॉफ़्टवेयर के मूल को शुद्ध शैली में लिखना संभव है, जबकि बाहरी आवरण में अभी भी अशुद्ध I / O प्रदर्शन कर रहा है। इसका मतलब यह भी है कि कोर स्टेटलेस हो सकता है।
स्टेटलेसनेस में कई व्यावहारिक फायदे हैं, जैसे कि उचित वृद्धि और मापनीयता। यह वेब एप्लिकेशन बैकएंड के लिए बहुत लोकप्रिय है। किसी भी राज्य को एक साझा डेटाबेस में बाहर रखा जाता है। यह लोड संतुलन को आसान बनाता है: मुझे सत्रों को किसी विशिष्ट सर्वर से चिपकाने की आवश्यकता नहीं है। यदि मुझे अधिक सर्वरों की आवश्यकता हो तो क्या होगा? बस एक और जोड़ें, क्योंकि यह एक ही डेटाबेस का उपयोग कर रहा है। क्या होगा अगर एक सर्वर क्रैश हो जाए? मैं किसी अन्य सर्वर पर किसी भी लंबित अनुरोध को फिर से कर सकता हूं। बेशक, अभी भी राज्य है - डेटाबेस में। लेकिन मैंने इसे स्पष्ट किया है और इसे निकाला है, और यदि मैं चाहता हूं तो आंतरिक रूप से शुद्ध कार्यात्मक दृष्टिकोण का उपयोग कर सकता हूं।