2015-09-01 5 views
7

मेरे पास एक इंटरफेस (डब्ल्यूएक्स) है जो प्रतिक्रियाशील केला पर आधारित है।प्रतिक्रियाशील केले: राज्य मोनैड या नहीं?

  1. मैं Behavior रों कि मैं कोड में परिभाषित के रूप में राज्य विचार करना चाहिए: अब मैं कैसे वास्तव में स्थिति का प्रबंधन करने के बारे में अलग प्रश्न हैं?

  2. यदि राज्य बाहरी "घटनाओं" पर भी निर्भर करता है, न केवल जीयूआई से संबंधित आईओआरएफ पर विचार करना बेहतर होगा?

  3. या क्या मैं राज्य मोनाड का उपयोग कर सकता हूं? आईओ पर्यावरण में नेटवर्क को परिभाषित करने के लिए अब तक किए गए सभी उदाहरण। क्या कोई समझ है State Monad और कैसे? Moment के साथ?

उत्तर

4

मैं व्यवहार है कि मैं कोड में परिभाषित के रूप में राज्य पर विचार करना चाहिए?

अधिकांश परिदृश्यों के लिए आप वास्तव में राज्य के लिए 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 
    
+0

धन्यवाद! बाहरी I/O कार्रवाई होने पर मुझे newEvent को फायर करने के बारे में विचार पसंद आया। मैं काम पर सीक्यूआरएस के लिए समान समाधान का उपयोग करता हूं लेकिन जीयूआई ऐप के लिए इसका इस्तेमाल करने के बारे में कभी सोचा नहीं। – Randomize

संबंधित मुद्दे