2012-05-28 14 views
7

से अद्यतित मूल्य मैं प्रतिक्रियाशील केले के साथ हास्केल में एक संगीत खिलाड़ी लिख रहा हूं। मेरे पास एक समस्या है जो पॉल के साथ अद्यतित मूल्य ला रही है। मैं खेलते समय उपयोगकर्ता को वैकल्पिक रूप से ट्रैक का एक हिस्सा चुनने में सक्षम करना चाहता हूं।प्रतिक्रियाशील-केले: पॉल

makePlayNetworkDescr :: Player a => AddHandler Command -> a -> NetworkDescription t() 
makePlayNetworkDescr addCmdEvent player = do 
    bPosition <- fromPoll (getPosition player) 
    eCmds <- fromAddHandler addCmdEvent 

    let eSetStart = filterE (isJust) $ bPosition <@ filterE (==SetStart) eCmds 
     eSetEnd = filterE (isJust) $ bPosition <@ filterE (==SetEnd) eCmds 
     eClearRange = filterE (==ClearRange) eCmds 

     bStart = accumB Nothing ((const <$> eSetStart) `union` (const Nothing <$ eClearRange)) 
     bEnd = accumB Nothing ((const <$> eSetEnd) `union` (const Nothing <$ eClearRange)) 

ऊपर, getPositionकुछ भी नहीं लौटने से पहले प्लेबैक वास्तव में शुरू होता है, एक आंशिक समारोह है: मेरे कोड कुछ इस तरह लग रहा है। समस्या यह है कि एक बार addCmdEvent पहली बार आग लगती है, bPosition अभी भी कुछ भी मान रखेगी। eSetStart/End इस पर आधारित उनके मूल्यों की गणना करें। केवल तभी bPosition अपडेट हो जाता है, और यह वह मान है जिसका उपयोग अगली बार addCmdEvent आग से किया जाएगा। और इसी तरह, मूल्य हमेशा "एक से बंद" होगा, इसलिए बोलने के लिए।

संबंधित SO question संबंधित है, लेकिन उस स्थिति में एक "ट्रिगर" ईवेंट मौजूद है जिसका उपयोग व्यवहार के नए मूल्य की गणना के लिए किया जा सकता है। क्या पॉली से ऐसा कुछ भी संभव है?

+0

जब आप समाप्त कर लेंगे, तो आपको परिणाम हैकेज पर रखना चाहिए। हास्केल से अपना संगीत बजाने के लिए तत्पर हैं! – amindfv

+0

मैं इसे एक बार हैक पर रखने की योजना बना रहा हूं (हां) मैं समाप्त हो गया हूं। हालांकि यह संगीत को ट्रांसक्रिप्शन करने में सहायता करने के लिए "संगीत का अपना खुजली" प्रकार का संगीत खिलाड़ी है, इसलिए मुझे यकीन नहीं है कि यह अन्य लोगों के लिए कितना दिलचस्प होगा। – oggy

उत्तर

2

प्रतिक्रियाशील-केले-0.5 और 0.6 के रूप में, fromPoll फ़ंक्शन किसी भी घटना से ईवेंट नेटवर्क को ट्रिगर करते समय व्यवहार को अद्यतन करता है। आप

eUpdate <- changes bSomeBehavior 

का उपयोग कर हालांकि द्वारा एक घटना के रूप में इन जानकारियों को ऐक्सेस कर सकते हैं, ध्यान दें कि व्यवहार निरंतर समय अलग-अलग मान जो एक "अद्यतन घटना" की एक सामान्य धारणा का समर्थन नहीं करते प्रतिनिधित्व करते हैं। changes फ़ंक्शन एक उपयोगी अनुमान वापस करने का प्रयास करेगा, लेकिन कोई औपचारिक गारंटी नहीं है।

वैकल्पिक रूप से, आप addCmdEvent के हिस्से के रूप में प्लेयर स्थिति को शामिल करने के लिए बाहरी ईवेंट को बदल सकते हैं। आपके मामले में, इसका मतलब SetStart और SetEnd रचनाकारों को अधिक डेटा जोड़ना है। उसके बाद, आप

eSetStart = filterJust $ matchSetStart <$> eCmds 
    where 
    matchSetStart (SetStart pos) = Just pos 
    matchSetStart _    = Nothing 

उपयोग कर सकते हैं दोनों समाधान की आवश्यकता एक व्यवहार के बजाय एक घटना के रूप में हाल ही में मूल्य निरीक्षण करने के लिए। इसका कारण यह है कि stepper के साथ बनाए गए व्यवहार हमेशा अपडेट किए जाने पर पुराने मान को वापस कर देंगे (वे "एक के पीछे पीछे हैं"), क्योंकि यह पुनरावर्ती परिभाषाओं के लिए बहुत उपयोगी है।

किसी भी मामले में, अंतर्निहित मुद्दे कि खिलाड़ी स्थिति बाह्य से काफी पहले addCmdEvent होता है अद्यतन किया जाता है है, लेकिन समस्या यह है कि यह क्या नहीं घटना नेटवर्क देखता है। इसके बजाय, नेटवर्क सोचता है कि fromPoll द्वारा व्यवहार व्यवहार addCmdEvent के साथ-साथ अद्यतन करता है। वास्तव में, जब तक कि आपके पास बाहरी स्थिति स्रोत तक पहुंच न हो जो खिलाड़ी की स्थिति को अपडेट करने के लिए ज़िम्मेदार है, यह केवल एक चीज है जिसे वह सोच सकता है। (यदि आपके पास पहुंच है, तो आप fromChanges फ़ंक्शन का उपयोग कर सकते हैं।)

मुझे एहसास है कि fromPoll का यह व्यवहार आपके सामान्य उपयोग के मामले में कुछ असंतोषजनक है। मुझे निराश नहीं है कि मुझे इसे अपनी लाइब्रेरी में ठीक करना चाहिए, हालांकि: fromPoll के बीच एक व्यापार-बंद है जो सबसे अच्छा मूल्य लौटा रहा है और changes फ़ंक्शन सबसे अच्छा करने का प्रयास कर रहा है।यदि नवीनतम मान वापस किया जाता है, तो changes व्यवहार करेगा जैसे कि उसने एक अपडेट छोड़ दिया है (जब मान बाहरी रूप से अपडेट किया गया था) और एक अनिवार्य एक ट्रिगर किया (जब नेटवर्क बाहरी से मेल खाने के लिए मूल्य अपडेट करता है)। यदि इस पर आपकी कोई राय है, तो कृपया मुझे बताएं।


ध्यान दें कि अनुप्रयोगी ऑपरेटर <*> साथ व्यवहार के संयोजन ठीक सबसे हाल ही में मूल्यों को जोड़ेगा।

+0

उत्तर के लिए धन्यवाद। अंत में मैं स्थिति डेटा को बाहरी रूप से मतदान करने और घटना में शामिल करने का मार्ग चला गया। इसके बारे में कुछ और सोचते हुए, मैं वास्तव में यह तय नहीं कर सकता कि क्या बाहरी स्रोत से प्राप्त करने की तुलना में ताला मूल्य से ताजा मूल्य प्राप्त करने से कोई वैचारिक लाभ है, न ही दूसरी तरफ। दूसरी तरफ, मुझे ताजा मान पढ़े जाने तक "ब्लॉकिंग" की समस्या पूरी तरह से नहीं मिलती है, और केवल उस घटना को फायर कर रहा है जिसने वास्तव में इस मूल्यांकन को ट्रिगर किया है (साथ ही परिवर्तन घटना के साथ), लेकिन आप अपनी लाइब्रेरी को जानते हैं मुझसे ज्यादा बेहतर – oggy