मैं प्रतिक्रियाशील केले में घटनाओं के एक निश्चित प्रकार के थ्रॉटलिंग को कार्यान्वित करना चाहता हूं। यह इस तरह काम करना चाहिए कि अगर घटना से गुज़रने वाली आखिरी घटना से डेल्टा सेकेंड कम हो तो एक घटना नहीं दी जाती है। यदि इसे तब तक नहीं छोड़ा जाता है, तो इसे संग्रहीत किया जाता है और आखिरी निकाल दिया गया ईवेंट से डेल्टा सेकेंड के बाद निकाल दिया जाता है।प्रतिक्रियाशील-केला थ्रॉटलिंग घटनाएं
नीचे एक ऐसा प्रोग्राम है जो समयबद्ध मुद्रित संख्याओं की सूचियों के लिए इसे लागू करता है। क्या प्रतिक्रियाशील-केले में इसका अनुवाद करना संभव होगा?
इसके अलावा, प्रतिक्रियाशील-केले में मैं किसी अन्य घटना के बाद एक घटना x सेकंड कैसे आग लगा सकता हूं?
module Main where import Data.List -- 1 second throtling -- logic is to never output a value before 1 second has passed since last value was outputed. main :: IO() main = print $ test [ (0.0, 1.0), (1.1, 2.0), (1.5,3.0), (1.7,4.0), (2.2, 5.0) ] --should output [ (0.0, 1.0), (1.1, 2.0), (2.1,4.0), (3.1, 5.0) ] test :: [(Double,Double)] -> [(Double,Double)] test list = g v (concat xs) where (v, xs) = mapAccumL f (-50,Nothing) list g (t, Just x) ys = ys ++ [ (t+1,x) ] g _ ys = ys f (lasttime, Just holdvalue) (t,x) = if t > (lasttime+1) then if t > (lasttime + 2) then ((t, Nothing), [ (lasttime+1,holdvalue), (t,x)]) else ((lasttime+1, Just x) , [ (lasttime+1,holdvalue) ]) else ((lasttime, Just x), []) f (lasttime, Nothing) (t,x) = if t > (lasttime+1) then ((t,Nothing) , [ (t, x) ]) else ((lasttime, Just x), [])
आप आईओ से खुश नहीं हैं, तो आप कुछ है कि संदेशों वाली एक घटना को सुनता है के रूप में टाइमर लागू कर सकते हैं ("शुरू", "बंद करो", "रीसेट") और एक अन्य घटना देता है। आम तौर पर, मैं उन कार्यों को रखने की अनुशंसा करता हूं जो 'नेटवर्कडिस्क्रिप्शन' मोनैड में 'रिएक्टिम' का उपयोग करते हैं, यानी 'थ्रॉटल :: ... -> नेटवर्क थ्रॉटल टी (इवेंट टा) '' थ्रॉटल :: .. -> (इवेंट टा, नेटवर्क डिस्क्रिप्शन टी()) '। –
ठीक है, जो इसे वास्तव में बहुत साफ बनाता है और वाक्यविन्यास के मामले में थ्रॉटल :: इवेंट टी ए -> इंट -> इवेंट टी ए (केवल उपयोग करें <- डू कथन में जाने के बजाय) से बहुत अलग नहीं है। मैंने आपके सुझाव के साथ पुनः कार्यान्वित किया है: https://gist.github.com/2905841। मुझे लगता है कि मैं इस समाधान से बहुत खुश हूं। –