परिभाषा के अनुसार, कार्यात्मक भाषाओं को राज्य चर नहीं बनाए रखना चाहिए। क्यों, फिर, हास्केल, क्लोजर, और अन्य सॉफ्टवेयर ट्रांसेक्शनल मेमोरी (एसटीएम) कार्यान्वयन प्रदान करते हैं? क्या दो दृष्टिकोणों के बीच संघर्ष है?
परिभाषा के अनुसार, कार्यात्मक भाषाओं को राज्य चर नहीं बनाए रखना चाहिए। क्यों, फिर, हास्केल, क्लोजर, और अन्य सॉफ्टवेयर ट्रांसेक्शनल मेमोरी (एसटीएम) कार्यान्वयन प्रदान करते हैं? क्या दो दृष्टिकोणों के बीच संघर्ष है?
जवाबों:
परस्पर क्रियाशील अवस्था बनाए रखने वाली कार्यात्मक भाषा में कुछ भी गलत नहीं है। यहां तक कि "शुद्ध" कार्यात्मक भाषाओं जैसे हास्केल को वास्तविक दुनिया के साथ बातचीत करने के लिए राज्य बनाए रखने की आवश्यकता है। क्लॉजुर जैसी "प्रभावशाली" कार्यात्मक भाषाएं साइड इफेक्ट की अनुमति देती हैं जिसमें उत्परिवर्तन राज्य शामिल हो सकते हैं।
मुख्य बिंदु यह है कि कार्यात्मक भाषाएं उत्परिवर्तनीय स्थिति को हतोत्साहित करती हैं जब तक कि आपको वास्तव में इसकी आवश्यकता न हो । सामान्य शैली शुद्ध कार्यों और अपरिवर्तनीय डेटा का उपयोग करके प्रोग्राम करना है, और केवल आपके कोड के विशिष्ट भागों में "अशुद्ध" उत्परिवर्तित स्थिति के साथ बातचीत करना है। इस तरह, आप अपने बाकी कोड बेस को "शुद्ध" रख सकते हैं।
मुझे लगता है कि कार्यात्मक भाषाओं में एसटीएम अधिक सामान्य है, इसके कई कारण हैं:
मैं व्यक्तिगत रूप से क्लोजर को अनुमति देने के दृष्टिकोण के बारे में पसंद करता हूं, लेकिन केवल कड़ाई से नियंत्रित "प्रबंधित संदर्भ" के संदर्भ में जो एसटीएम लेनदेन में भाग ले सकता है। भाषा में बाकी सब कुछ "विशुद्ध रूप से कार्यात्मक" है।
;; define two accounts as managed references
(def account-a (ref 100))
(def account-b (ref 100))
;; define a transactional "transfer" function
(defn transfer [ref-1 ref-2 amount]
(dosync
(if (>= @ref-1 amount)
(do
(alter ref-1 - amount)
(alter ref-2 + amount))
(throw (Error. "Insufficient balance!")))))
;; make a stranfer
(transfer account-a account-b 75)
;; inspect the accounts
@account-a
=> 25
@account-b
=> 175
ध्यान दें कि उपरोक्त कोड पूरी तरह से लेन-देन और परमाणु है - एक बाहरी पर्यवेक्षक जो दूसरे लेनदेन के भीतर दो शेष राशि को पढ़ता है, उसे हमेशा एक सुसंगत परमाणु स्थिति दिखाई देगी, अर्थात दो शेष राशि हमेशा 200 के योग होंगी। लॉक-आधारित संगामिति के साथ, यह आश्चर्यजनक रूप से कठिन समस्या है। कई जटिल संस्थाओं के साथ एक बड़ी जटिल प्रणाली में हल करने के लिए।
कुछ अतिरिक्त ज्ञानोदय के लिए, रिच हिकी इस वीडियो में क्लजुरे के एसटीएम को समझाने का एक उत्कृष्ट काम करता है
परिभाषा के अनुसार, कार्यात्मक भाषाओं को राज्य चर नहीं बनाए रखना चाहिए
आपकी परिभाषा गलत है। भाषा जो राज्य को बनाए नहीं रख सकती है, उसका उपयोग नहीं किया जा सकता है।
कार्यात्मक और अनिवार्य भाषाओं के बीच का अंतर यह नहीं है कि उनमें से एक में राज्य है और दूसरा नहीं है। यह एक तरह से वे राज्य बनाए रखते हैं।
इंपीरियल भाषाओं में पूरे कार्यक्रम में राज्य का प्रसार है।
कार्यात्मक भाषाएं अलग-अलग प्रकार के हस्ताक्षर के माध्यम से राज्य को स्पष्ट रूप से अलग और बनाए रखती हैं। और यही कारण है कि वे एसटीएम जैसे परिष्कृत राज्य प्रबंधन तंत्र प्रदान करते हैं।
कभी-कभी एक प्रोग्राम को म्यूटेबल स्थिति (उदाहरण के लिए, वेब ऐप के लिए डेटाबेस सामग्री) की आवश्यकता होती है और यह कार्यात्मक प्रोग्रामिंग के लाभों को खोए बिना इसका उपयोग करने में सक्षम होने के लिए बहुत अच्छा होगा । गैर-कार्यात्मक भाषाओं में, उत्परिवर्तनीय राज्य सब कुछ की अनुमति देता है। यदि आप इसे किसी विशेष एपीआई के साथ स्पष्ट करते हैं , तो आप इसे एक छोटे से पहचान योग्य क्षेत्र तक सीमित कर सकते हैं, जबकि बाकी सब कुछ पूरी तरह से कार्यात्मक है। एफपी के लाभों में आसान डीबगिंग, रिपीटेबल यूनिट टेस्टिंग, दर्द रहित कंसीलर और मल्टीकोर / जीपीयू मित्रता शामिल हैं।