मैं पहली बार अपने दूसरे सवाल का जवाब देने जा रहा हूँ। हास्केल (और अन्य एफपी भाषाओं) में परिवर्तनीय स्थिति को संभालने के लिए वास्तव में कई तरीके हैं। सबसे पहले, हास्केल आईओओ में IORef
और mvar
संरचनाओं के माध्यम से उत्परिवर्तनीय स्थिति का समर्थन करता है। इनका उपयोग करना अनिवार्य भाषाओं से प्रोग्रामर से बहुत परिचित होगा। STRef
और TMVar
, साथ ही साथ परिवर्तनीय सरणी, पॉइंटर्स और कई अन्य परिवर्तनीय डेटा जैसे विशेष संस्करण भी हैं। सबसे बड़ी कमी यह है कि ये आम तौर पर केवल आईओ या अधिक विशिष्ट मोनैड के भीतर उपलब्ध होते हैं।
एक कार्यात्मक भाषा में राज्य अनुकरण करने का सबसे आम तरीका स्पष्ट रूप से एक कार्य तर्क के रूप में राज्य को गुजर रहा है और मूल्य वापस कर दिया गया है। उदाहरण के लिए:
randomGen :: Seed -> (Int, Seed)
यहाँ randomGen
एक बीज पैरामीटर लेता है और एक नया बीज देता है। हर बार जब आप इसे कॉल करते हैं, तो आपको अगले पुनरावृत्ति के लिए बीज का ट्रैक रखने की आवश्यकता होती है। यह तकनीक हमेशा राज्य के गुजरने के लिए उपलब्ध है, लेकिन यह जल्दी से थकाऊ हो जाता है।
शायद सबसे आम हास्केल दृष्टिकोण इस राज्य को गुजरने के लिए एक मोनैड का उपयोग करना है। हम इस के साथ randomGen
की जगह ले सकता:
-- a Random monad is simply a Seed value as state
type Random a = State Seed a
randomGen2 :: Random Int
randomGen2 = do
seed <- get
let (x,seed') = randomGen seed
put seed'
return x
अब किसी भी कार्य करता है जो की जरूरत है एक PRNG रैंडम इकाई के भीतर चला सकते हैं उन्हें आवश्यकतानुसार अनुरोध करने के लिए। आपको केवल प्रारंभिक स्थिति और गणना प्रदान करने की आवश्यकता है।
runRandomComputation :: Random a -> Seed -> a
runRandomComputation = evalState
(ध्यान दें कि यादृच्छिक जीन 2 की परिभाषा को काफी कम करता है; मैंने सबसे स्पष्ट संस्करण चुना है)।
यदि आपकी यादृच्छिक गणना को IO
तक पहुंच की आवश्यकता है, तो आप राज्य के 0,के मोनैड ट्रांसफार्मर संस्करण का उपयोग करें।
विशेष नोट ST
मोनैड है, जो अनिवार्य रूप से आईओ-विशिष्ट उत्परिवर्तनों को आईओ के बाकी हिस्सों से दूर करने के लिए एक तंत्र प्रदान करता है। एसटी मोनड एसटीआरआईएफ प्रदान करता है, जो डेटा के एक परिवर्तनीय संदर्भ हैं, और म्यूटेबल सरणी भी हैं।अनुसूचित जनजाति का उपयोग करना, यह इस तरह बातें निर्धारित करना संभव है:
randomList :: Seed -> [Int]
जहां [इंट] यादृच्छिक संख्या की एक अनंत सूची (यह चक्र के अंत में अपने PSRG के आधार पर होगा) प्रारंभिक बीज आप इसे देने से है।
अंत में, Functional Reactive Programming है। इसके लिए वर्तमान में सबसे प्रमुख पुस्तकालय Yampa और Reactive हैं, लेकिन अन्य भी देख रहे हैं। एफआरपी के विभिन्न कार्यान्वयन के भीतर परिवर्तनीय राज्य के कई दृष्टिकोण हैं; उनके थोड़े उपयोग से वे अकसर क्यूटी या जीटीके + (जैसे घटनाओं के लिए श्रोताओं को जोड़ना) में एक सिग्नलिंग फ्रेमवर्क के लिए अवधारणा में समान दिखते हैं।
अब, पहले प्रश्न के लिए। मेरे लिए, सबसे बड़ा फायदा यह है कि उत्परिवर्तनीय राज्य प्रकार के स्तर पर दूसरे कोड से अलग होता है। इसका अर्थ यह है कि जब तक कोड हस्ताक्षर में स्पष्ट रूप से उल्लेख नहीं किया जाता है तब तक कोड गलती से राज्य को संशोधित नहीं कर सकता है। यह पठनीय राज्य बनाम केवल पढ़ने योग्य राज्य (रीडर मोनड बनाम राज्य मोनड) का बहुत अच्छा नियंत्रण देता है। मुझे इस तरह से मेरे कोड को ढूढ़ने में बहुत उपयोगी लगता है, और यदि कोई फ़ंक्शन अप्रत्याशित रूप से स्थिति को बदल सकता है तो यह केवल प्रकार के हस्ताक्षर से बताने में सक्षम होना उपयोगी है।
मैं व्यक्तिगत रूप से हास्केल में उत्परिवर्तनीय स्थिति का उपयोग करने के बारे में कोई आरक्षण नहीं करता हूं। सबसे बड़ी कठिनाई यह है कि राज्य को उस चीज़ को जोड़ने के लिए कठिन हो सकता है जिसकी आवश्यकता पहले नहीं थी, लेकिन वही बात अन्य भाषाओं में कठिन होगी जो मैंने समान कार्यों (सी #, पायथन) के लिए उपयोग की है।
http://www.haskell.org/all_about_monads/html/statemonad.html –
एक कार्यात्मक भाषा में राज्य को संभालने में राज्य को कार्यों के चारों ओर गुजरना शामिल है। मोनाड्स इसे सरल बनाते हैं। – tylermac
@tylermac मैं कभी भी monads को समझने में सक्षम नहीं था, ठीक है, मैं यह नहीं कह सकता कि मैं बेवकूफ हूँ, कम से कम मैं सीएस में बीएस हूं, लेकिन monads ... क्या आप अच्छे ट्यूटोरियल जानते हैं? – Andrey