मैं व्यवहार है कि मैं कोड में परिभाषित के रूप में राज्य पर विचार करना चाहिए?
अधिकांश परिदृश्यों के लिए आप वास्तव में राज्य के लिए Behavior
एस का उपयोग करना चाहते हैं। एक जीयूआई आवेदन में आप अक्सर इंटरफेस घटनाओं के जवाब में अपने राज्य को अपडेट करना चाहते हैं। इसके अलावा, और महत्वपूर्ण बात यह है कि राज्य घटनाओं की घटनाओं के बीच मौजूदा रहना चाहिए, और State
इसकी अनुमति नहीं देता है। विशेष रूप से, मानक तरीका एक Behavior
को अद्यतन करने के अलावा कुछ कर रही एक घटना घटना पर प्रतिक्रिया करने reactimate
समारोह के माध्यम से है:
reactimate :: Frameworks t => Event t (IO()) -> Moment t()
कार्रवाई की जानी प्रकार IO()
की है। का उपयोग गणना reactimate
का उपयोग करके गणना करने के लिए runStateT
का उपयोग करना संभव है, गणना गणना स्वयं निहित होगी, और आपके पास यह राज्य नहीं होगा जो इसे कहीं और पारित करने के लिए उपलब्ध होगा। प्रतिक्रियाशील-केला एफआरपी इंटरफ़ेस के माध्यम से Behavior
एस अपडेट करने के लिए Event
एस का उपयोग करते समय यह समस्या उत्पन्न नहीं होती है: Behavior
तब तक वहां रहती है जब तक आपको उन्हें फिर से उपयोग करने की आवश्यकता न हो।
यदि राज्य बाहरी "घटनाओं" पर भी निर्भर करता है, न केवल जीयूआई से संबंधित आईओआरएफ पर विचार करना बेहतर होगा?
आवश्यक नहीं है। कई मामलों में आप Reactive.Banana.Frameworks
जैसे fromAddHandler
और newEvent
में टूल का उपयोग Event
एस बनाने के लिए कर सकते हैं जिन्हें बाहरी I/O क्रियाएं होती हैं। इस तरह आप अपने कार्यक्रम नेटवर्क में ऐसे कार्यों को एकीकृत कर सकते हैं। एक सामान्य उदाहरण a timer होगा: प्रतिक्रियाशील-केला में समय की कोई अंतर्निहित धारणा नहीं है, लेकिन आप एक टिक घटना शुरू कर सकते हैं जिसे नियमित अंतराल पर होने वाली आई/ओ क्रिया के माध्यम से निकाल दिया जाता है।
कहा, कुछ मामलों में आप अभी भी उपयोग कर सकते हैं ...
... IORef
रों (परिवर्तनशील चर के या अन्य प्रकार, जैसे MVar
रों), यदि आपके पास प्रयोग करने में एक इंटरफ़ेस वाला एक लाइब्रेरी, जो भी कारण से, Behavior
एस और reactimate
का उपयोग करके ईवेंट पर स्वतंत्र रूप से प्रतिक्रिया करने की आपकी क्षमता को प्रतिबंधित करता है। कुछ समय पहले a very nice question about such a scenario involving hArduino
था। वहां दो उत्तरों अलग दिखते हैं, फिर भी भावनात्मक रूप से समान हैं, प्रतिकूल परिस्थितियों में एक उपयोगी घटना नेटवर्क के तरीके।
... StateT
आप कुछ स्टेटफुल एल्गोरिथ्म संयमी और जिसका परिणाम आपके घटना नेटवर्क में कहीं और उपयोग नहीं किया जाएगा यह है कि, ताकि आप इसे runStateT
साथ चलाने के लिए और एक reactimate
कॉल में यह छड़ी कर सकते हैं है। बेवकूफ उदाहरण: इन पंक्तियों के साथ reactimate
में एक IO()
कार्रवाई:
displayMessageBox . show =<< evalStateT someStateComputation initialState
धन्यवाद! बाहरी I/O कार्रवाई होने पर मुझे newEvent को फायर करने के बारे में विचार पसंद आया। मैं काम पर सीक्यूआरएस के लिए समान समाधान का उपयोग करता हूं लेकिन जीयूआई ऐप के लिए इसका इस्तेमाल करने के बारे में कभी सोचा नहीं। – Randomize