2012-04-03 8 views
7

प्रतिक्रियाशील-केले में मैं एक घटना धारा है कि संख्या, जिनमें से कुछ एक पंक्ति में कई बार दोहराने की एक श्रृंखला का उत्पादन (मैं नहीं कर रहा हूँ सभी डुप्लिकेट के साथ संबंध मिल गया है को दूर करते हैं, बस अनुक्रमिक डुप्लिकेट)। मैं केवल ईवेंट अनुक्रमिक डुप्लीकेट रखने के लिए उस ईवेंट स्ट्रीम को कैसे संशोधित कर सकता हूं?कैसे आप दोहरा प्रतिक्रियाशील-केले में घटनाओं

मैंने इसे व्यवहार में बदलने के लिए परिवर्तनों का उपयोग करने की कोशिश की, यह सोचने के लिए कि व्यवहार केवल एक नया नंबर था जब व्यवहार केवल "बदल जाएगा" बल्कि इसके बजाय व्यवहार हर बार एक नया इनपुट इवेंट प्राप्त होने पर एक बदलाव घटना को ट्रिगर करता है।

उत्तर

6

ध्यान दें कि changes समारोह केवल जीयूआई उपकरणकिटें और thelike के लिए बाध्य लिए इस्तेमाल किया जा चाहिए, यह नहीं घटनाओं और व्यवहार के साथ नियमित रूप से प्रोग्रामिंग के लिए इस्तेमाल किया जाना चाहिए। के रूप में चल रहा है test

skipEqual :: Eq a => Event t a -> Event t a 
skipEqual = filterJust . fst . mapAccum Nothing . fmap f 
    where 
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y) 
    f y Nothing = (Just y, Just y) 

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2] 

इस प्रकार

एक समारोह है कि डुप्लिकेट घटना घटनाओं supresses mapAccum और filterJust combinators के रूप में व्यक्त किया जा सकता है देता है

*Main> test 
[[1],[],[2],[3],[],[2]] 

के रूप में वांछित।

दूसरे शब्दों में, आप बस Event की घटनाओं की सूची के रूप में कल्पना कर सकते हैं और फिर उस पर अपनी प्यारी "सूची" संयोजक लागू कर सकते हैं।

+0

ओह, क्यों मुझे लगता है कि नहीं सोचा था ?! मैंने इस के पक्ष में अपने उत्तर से बदसूरत कार्यान्वयन हटा दिया है। – ehird

+1

यदि आपको परिवर्तनों का उपयोग नहीं करना चाहिए, तो आप व्यवहार के साथ सार्थक कुछ भी कैसे करते हैं? – Orclev

+0

@ ऑर्केलेव: आप घटनाओं पर व्यवहार लागू कर सकते हैं। इसके लिए '<@>' और '<@' ऑपरेटरों का उपयोग किया जाता है। इसके अलावा, आप व्यवहार और घटनाओं के बीच पारस्परिक पुनरावृत्ति का उपयोग कर सकते हैं। –

0

अच्छा, changes कुछ भी Behavior में नहीं बदलता है; यह सिर्फ आप NetworkDescription में एक Behavior के परिवर्तन का निरीक्षण , ताकि आप इसे बाहरी ढाँचे को गोंद कर सकते हैं कर सकते हैं। behaviour of changes को changes (stepper x e)return (calm e) के रूप में वर्णित किया गया है, इसलिए stepper और changes के माध्यम से एक ईवेंट को राउंड-ट्रिपिंग calm के अलावा कोई प्रभाव नहीं पड़ेगा (जो कि सभी समसामयिक घटनाओं को छोड़ देता है लेकिन पहले)।

उन घटनाओं को त्यागने के लिए एक संयोजक होना उपयोगी है जो मूल्य को नहीं बदलते हैं, और मुझे लगता है कि कुछ अन्य एफआरपी ढांचे में एक बनाया गया है। लेकिन आप हेनरिक के उत्तर दिखाते हुए अपना खुद का आसानी से लिख सकते हैं।

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