2016-02-26 13 views
14

ReactiveX introduction page से:क्या रेएक्टिवएक्स प्रतिक्रियाशील प्रोग्रामिंग माना जाता है?

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

इस बीच, Wikipedia's Functional Reactive Programming page से, ReactiveX "क्रियान्वयन" खंड में सूचीबद्ध है:

क्रियान्वयन [संपादित करें]

  • cellx, जावास्क्रिप्ट के लिए प्रतिक्रिया की अल्ट्रा तेजी से कार्यान्वयन
  • एल्म, एफआरपी भाषा जो एचटीएमएल, सीएसएस, और जावास्क्रिप्ट को संकलित करती है
  • रूब में फ्रैप्रुचिनो एफआरपी कार्यान्वयन y
  • Flapjax, जावास्क्रिप्ट में व्यवहार/घटना एफआरपी कार्यान्वयन
  • Reactive.jl, जूलिया
  • में एफ आर पी कार्यान्वयन
  • ReactiveX, जावा, जावास्क्रिप्ट, अजगर, स्विफ्ट और कई और अधिक
  • सहित कई भाषाओं में एफआरपी कार्यान्वयन हास्केल में
  • प्रतिक्रियाशील-केला एफआरपी कार्यान्वयन
  • ReactiveCocoa एफआरपी स्विफ्ट और ऑब्जेक्टिव-सी में लागू शुद्ध स्विफ्ट में
  • कार्यान्वित
  • ReactiveKit एफआरपी हास्केल में
  • स्काला (और Scala.js) में
  • Scala.Rx एफआरपी कार्यान्वयन
  • सोडियम, सी # में एफ आर पी कार्यान्वयन, सी ++, हास्केल (हटा दिया गया [12]), जावा,> जंग, और स्काला
  • पलटा एफआरपी कार्यान्वयन
  • हास्केल

में याम्पा एफआरपी कार्यान्वयन मैं काफी समझ में क्या ReactiveX करता है, और यह भी के बारे में "रिएक्टिव प्रोग्रामिंग" और "कार्यात्मक रिएक्टिव प्रोग्रामिंग" कुछ शोध किया था, लेकिन मैं अभी भी उनके बीच संबंधों को भेद नहीं कर सकते।

वास्तव में, मैं एक तरह से विश्वास है कि विकिपीडिया पृष्ठ मिथ्या नाम, या गलत तरीके से "कार्यान्वयन" खंड में उदाहरण लिस्टिंग है, क्योंकि मुझे पता है कि cellx और ReactiveX (जो दोनों उदाहरण में सूचीबद्ध है) बनाया गया है पूरी तरह से अलग हल करने के लिए समस्या का।

उत्तर

14

यहां प्रतिक्रियाशील-केले पुस्तकालय के लेखक।

कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग (FRP) और प्रतिक्रियाशील प्रोग्रामिंग (आर) के बीच मुख्य अंतर यह है कि पूर्व एक अच्छी तरह से परिभाषित denotational अर्थ विज्ञान, आम तौर पर प्रकार

type Behavior a ~= Time -> a 
type Event a ~= [(Time, a)] 

से प्राप्त जबकि बाद नहीं है में एक अच्छी तरह से परिभाषित denotational semantics है।विशेष रूप से, मुझे पता है कि आरएक्स के सभी कार्यान्वयन समस्या से पीड़ित हैं जो घटना धाराओं को विलय कर रहा है गैर-निर्धारिती: जब धाराओं में एक साथ घटनाएं होती हैं, तो कभी-कभी एक घटना दूसरे के सामने विलय हो जाती है, और कभी-कभी दूसरी तरफ।

इसके अलावा, यह बयान कि "एफ आर पी मूल्यों कि समय के साथ लगातार बदलने पर चल रही है" दोनों आसानी से गलत है और महत्वपूर्ण अंतर है:

  • सबसे पहले, इस बयान के लिए सबसे संभावित पार्स है कि "व्यवहार हो रहा है निरंतर कार्य Time -> a ", जो सत्य नहीं है: व्यवहार डी निरंतर हो सकता है, उदाहरण के लिए वे चरणबद्ध कार्य हो सकते हैं। इसके बजाय सच यह है कि एफआरपी में Time आमतौर पर वास्तविक संख्या के रूप में लिया जाता है, यानी निरंतर मूल्यों के लिए।
  • दूसरा, एफआरपी होना पूरी तरह से संभव है जहां समय अलग है। आरपी के लिए यह महत्वपूर्ण अंतर नहीं है, इसके बजाए यह सब कुछ है कि मूल्यों पर आपके संचालन में एक अच्छी तरह से परिभाषित denotational semantics है या नहीं।
+0

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद, क्या आप कोड ब्लॉक में डाले गए उन प्रकारों को समझा सकते हैं? – TrungDQ

+0

@TrungDQ ठीक है, प्रकार 'समय -> ए' प्रकार 'टाइम' प्रकार के एक पैरामीटर और' ए' प्रकार के परिणाम मान के साथ एक फ़ंक्शन को दर्शाता है। इसे एक मूल्य के रूप में व्याख्या किया जा सकता है जो समय के साथ बदलता है। प्रकार '[(समय, ए)] 'प्रकार' मान 'के मानों के जोड़े और' ए' प्रकार के मानों की सूची को दर्शाता है। इसे घटनाओं के एक सेट के रूप में व्याख्या किया जा सकता है जब समय पर अलग-अलग बिंदुओं पर होता है। –

5

जहां तक ​​मैं समझता हूं, ReactiveX (उर्फ आरएक्स) के दृष्टिकोण से, यह एक ही समय में दो घटनाओं के साथ असंभव है। सदस्यता सदस्यता के क्रम में ये केवल कॉलबैक आंतरिक रूप से निकाल दिए जा रहे हैं, अनुक्रमिक रूप से । आरएक्स समय "प्रबंधन" नहीं करता है।

आरएक्स एक शुद्ध एफआरपी प्रोग्रामर की आंखों के माध्यम से देखा जाने वाला पागल काम कर सकता है। निम्नलिखित RXJS कोड पर विचार करें:

const xs = Rx.Observable 
    .interval(0) 
    //.share(); 

xs.combineLatest(xs, (a,b) => [a,b]) 
    .filter(ab => ab[1] > ab[0]) 
    .take(1) 
    .subscribe(ab => alert(ab)); 

यहाँ xs एक ठंड नमूदार अंतराल के रूप में तेजी से संभव सक्रिय करता है। चूंकि xs.combineLatest (ys, f) हमेशा xs पर सदस्यता लेता है, फिर ys पर, [0,0], [1,0], [1,1], [2,1], ... का उत्पादन करने के लिए आपको xs.combineLatest(xs, (a,b) => [a,b]) की उम्मीद होगी तो ab[1] > ab[0] हमेशा झूठा होना चाहिए। लेकिन, मेरा पीसी पर, अगर मैं इस कोड को थोड़ी देर के लिए चालू रखने के लिए, यह कुछ बिंदु it could take a while, try it yourself

ऐसा इसलिए है क्योंकि xs है पर समाप्त होता है एक ठंड नमूदार: interval को प्रत्येक सदस्यता एक स्वतंत्र रूप से चल रहा है समय-समय पर टाइमर का निर्माण करेगा। ये टाइमर कर सकते हैं और एक अलग आदेश

(विशेष रूप से नेट की तरह मल्टी-थ्रेडेड वातावरण पर) में कुछ बिंदु आग पर अगर हम बाहर टिप्पणी //share लाइन, xsगर्म बनाने, अनुक्रम कभी नहीं पूरा करता होगा, के रूप में [0,0], [1,0], [1,1], ... ,[i,i-1],[i,i]... है अब निश्चित रूप से उत्पन्न हुआ। ऐसा इसलिए है क्योंकि एक गर्म अवलोकन एक एकल सदस्यता साझा करता है। इस मामले में केवल एक टाइमर बनाया गया है।

एक असली एफआरपी प्रणाली में, यह व्यवहार निर्धारक होगा। हालांकि, यदि आप वास्तव में एक वास्तविक एफआरपी सिस्टम में विभिन्न हार्डवेयर टाइमर के लिए हुकअप करेंगे, तो आपको आरएक्स के समान व्यवहार भी मिलेगा, क्योंकि ये बाहरी घटनाएं यादृच्छिक क्रम में आग लगती हैं, जब तक कि दो टाइमर पूरी तरह से सिंक्रनाइज़ नहीं होते हैं

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