functional programming - (कार्यात्मक) प्रतिक्रियाशील प्रोग्रामिंग क्या है?




functional-programming terminology (12)

.NET के लिए आरएक्स, प्रतिक्रियाशील एक्सटेंशन देखें। वे इंगित करते हैं कि IENumerable के साथ आप मूल रूप से एक स्ट्रीम से 'खींच' रहे हैं। IQueryable / IEnumerable पर लिंक प्रश्न सेट हैं जो सेट को परिणामों से 'चूसते हैं'। लेकिन IOervervable पर एक ही ऑपरेटरों के साथ आप लिंक प्रतिक्रियाएं लिख सकते हैं जो 'प्रतिक्रिया' करते हैं।

उदाहरण के लिए, आप एक लिंक क्वेरी लिख सकते हैं (एम से MyObservableSetOfMouseMovements जहां एमएक्स <100 और एमवाई <100 नया प्वाइंट (एमएक्स, एमवाई) चुनें)।

और आरएक्स एक्सटेंशन के साथ, यह है: आपके पास यूआई कोड है जो माउस मूवमेंट की आने वाली स्ट्रीम पर प्रतिक्रिया करता है और जब भी आप 100,100 बॉक्स में होते हैं तो ड्रॉ करता है ...

मैंने प्रतिक्रियाशील प्रोग्रामिंग पर विकिपीडिया लेख पढ़ा है। मैंने कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग पर छोटे लेख को भी पढ़ा है। विवरण काफी सार हैं।

  1. कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग (एफआरपी) अभ्यास में क्या मतलब है?
  2. प्रतिक्रियाशील प्रोग्रामिंग (गैर-प्रतिक्रियाशील प्रोग्रामिंग के विपरीत?) में क्या शामिल है?

मेरी पृष्ठभूमि अनिवार्य / ओओ भाषाओं में है, इसलिए इस प्रतिमान से संबंधित एक स्पष्टीकरण की सराहना की जाएगी।


अस्वीकरण: मेरा उत्तर rx.js के संदर्भ में है - जावास्क्रिप्ट के लिए एक 'प्रतिक्रियाशील प्रोग्रामिंग' लाइब्रेरी।

कार्यात्मक प्रोग्रामिंग में, संग्रह के प्रत्येक आइटम के माध्यम से पुनरावृत्ति करने के बजाय, आप संग्रह में उच्च ऑर्डर फ़ंक्शन (होएफ) लागू करते हैं। तो एफआरपी के पीछे विचार यह है कि प्रत्येक व्यक्तिगत घटना को संसाधित करने के बजाय, घटनाओं की एक धारा बनाएं (एक अवलोकन * के साथ लागू) और इसके बजाय होफ़्स लागू करें। इस तरह आप सिस्टम को प्रकाशकों को कनेक्ट करने वाले डेटा पाइपलाइनों के रूप में देख सकते हैं।

एक अवलोकन योग्य का उपयोग करने के प्रमुख फायदे हैं:
i) यह आपके कोड से राज्य को दूर करता है, उदाहरण के लिए, यदि आप ईवेंट हैंडलर को केवल 'एन'थ इवेंट' के लिए निकाल दिया जाना चाहते हैं, या पहले 'एन' घटनाओं के बाद फायरिंग बंद करना चाहते हैं, या केवल पहले 'एन के बाद फायरिंग शुरू करना चाहते हैं 'घटनाओं, आप काउंटर सेट करने, अद्यतन करने और जांचने के बजाय केवल होफ्स (फिल्टर, ले लें, छोड़ें, क्रमशः छोड़ें) का उपयोग कर सकते हैं।
ii) यह कोड इलाके में सुधार करता है - यदि आपके पास घटक के राज्य को बदलने वाले 5 अलग-अलग ईवेंट हैंडलर हैं, तो आप अपने अवलोकनों को मर्ज कर सकते हैं और इसके बजाय मर्ज किए गए अवलोकन योग्य पर एक इवेंट हैंडलर को परिभाषित कर सकते हैं, प्रभावी ढंग से 5 ईवेंट हैंडलर को 1 में जोड़ सकते हैं। इससे यह बहुत हो जाता है आपके पूरे सिस्टम में कौन सी घटनाएं किसी घटक को प्रभावित कर सकती हैं, इस बारे में तर्क करना आसान है, क्योंकि यह सब एक ही हैंडलर में मौजूद है।

  • एक पर्यवेक्षक एक इटरटेबल का दोहरी है।

एक Iterable एक आलसी उपभोग अनुक्रम है - जब भी यह इसका उपयोग करना चाहता है, प्रत्येक आइटम इटेटरेटर द्वारा खींचा जाता है, और इसलिए गणना उपभोक्ता द्वारा संचालित होती है।

एक अवलोकन एक आलसी उत्पादित अनुक्रम है - अनुक्रम में जोड़े जाने पर प्रत्येक आइटम पर्यवेक्षक को धक्का दिया जाता है, और इसलिए गणना निर्माता द्वारा संचालित होती है।


एक स्प्रेडशीट जैसे अधिनियमों के रूप में उल्लेख किया। आमतौर पर एक घटना संचालित ढांचे के आधार पर।

सभी "प्रतिमानों" के साथ, यह नवीनता बहस योग्य है।

अभिनेताओं के वितरित प्रवाह नेटवर्क के अपने अनुभव से, यह आसानी से नोड्स के नेटवर्क में राज्य स्थिरता की सामान्य समस्या का शिकार हो सकता है यानी आप अजीब लूप में बहुत अधिक उत्तेजना और फंसाने के साथ समाप्त होते हैं।

कुछ सेमेन्टिक्स रेफरेंसियल लूप या ब्रॉडकास्टिंग को इंगित करते हैं, और यह काफी अराजक हो सकता है क्योंकि कुछ अप्रत्याशित राज्यों पर कलाकारों का नेटवर्क अभिसरण (या नहीं) होता है।

इसी प्रकार, कुछ राज्यों को अच्छी तरह से परिभाषित किनारों के बावजूद नहीं पहुंचाया जा सकता है, क्योंकि वैश्विक राज्य समाधान से दूर चला जाता है। 2 + 2 2 हो सकता है या नहीं हो सकता है जब 2 2 बन गया है, और क्या वे इस तरह से रहे। स्प्रेडशीट्स में तुल्यकालिक घड़ियों और लूप का पता लगाना होता है। वितरित अभिनेता आम तौर पर नहीं करते हैं।

सब अच्छा मज़ा :)।


एफआरपी कार्यात्मक प्रोग्रामिंग का एक संयोजन है (सब कुछ के विचार पर बनाया गया प्रोग्रामिंग प्रतिमान एक कार्य है) और प्रतिक्रियाशील प्रोग्रामिंग प्रतिमान (इस विचार पर बनाया गया है कि सब कुछ एक धारा (पर्यवेक्षक और देखने योग्य दर्शन) है)। यह दुनिया का सबसे अच्छा माना जाता है।

शुरू करने के लिए प्रतिक्रियाशील प्रोग्रामिंग पर आंद्रे स्टाल्टज़ पोस्ट देखें।


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

पेपर अब एक और पेपर से चिपक गया है, पुश-पुल कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग ( सीधा पीडीएफ , 286 केबी)।


ठीक है, पृष्ठभूमि ज्ञान से और जिस विकिपीडिया पेज को आपने इंगित किया है, उसे पढ़ने से, ऐसा लगता है कि प्रतिक्रियाशील प्रोग्रामिंग डेटाफ्लो कंप्यूटिंग की तरह कुछ है लेकिन विशिष्ट बाह्य "उत्तेजना" के साथ नोड्स के एक सेट को आग लगने और उनकी गणना करने के लिए ट्रिगर करने के साथ।

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

उस "वॉल्यूम वैल्यू" नोड से किनारों वाले विभिन्न नोड स्वचालित रूप से ट्रिगर हो जाएंगे और किसी आवश्यक कंप्यूटेशंस और अपडेट स्वाभाविक रूप से एप्लिकेशन के माध्यम से पलट जाएंगे। आवेदन उपयोगकर्ता उत्तेजना के लिए "प्रतिक्रिया करता है"। कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग केवल एक कार्यात्मक भाषा में, या आम तौर पर एक कार्यात्मक प्रोग्रामिंग प्रतिमान में इस विचार का कार्यान्वयन होगा।

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

जब कोई नोड आग लगता है या इसकी गणना करता है, तो उसके आउटपुट से जुड़े नोड्स में उनके संबंधित इनपुट "ट्रिगर" या "चिह्नित" होते हैं। किसी भी नोड में सभी इनपुट ट्रिगर / चिह्नित / उपलब्ध स्वचालित रूप से आग लगती हैं। प्रतिक्रिया वास्तव में कैसे प्रतिक्रियाशील प्रोग्रामिंग लागू किया गया है इस पर निर्भर करता है कि ग्राफ निहित या स्पष्ट हो सकता है।

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

प्रतिक्रियाशील प्रोग्रामिंग इस "निष्पादन का कैस्केड" विचार आयात करती है और डेटाफ्लो-जैसी फैशन में प्रोग्राम के बारे में सोचती है लेकिन यह साबित करती है कि कुछ नोड्स को "बाहरी दुनिया" से जोड़ दिया जाता है और इन संवेदी होने पर निष्पादन के कैस्केड ट्रिगर होते हैं जैसे नोड्स बदलते हैं। प्रोग्राम निष्पादन तब एक जटिल प्रतिबिंब चाप के समान कुछ जैसा दिखता है। कार्यक्रम उत्तेजना के बीच मूल रूप से क्षैतिज हो सकता है या नहीं हो सकता है या उत्तेजना के बीच मूल रूप से क्षैतिज स्थिति में बस सकता है।

"गैर-प्रतिक्रियाशील" प्रोग्रामिंग निष्पादन के प्रवाह और बाहरी इनपुट के संबंध के एक बहुत अलग दृष्टिकोण के साथ प्रोग्रामिंग होगा। यह कुछ हद तक व्यक्तिपरक होने की संभावना है, क्योंकि लोगों को बाहरी इनपुट के जवाब देने वाले कुछ भी कहने का लुत्फ उठाना होगा। लेकिन इस बात की भावना को देखते हुए, एक कार्यक्रम जो एक निश्चित अंतराल पर एक घटना कतार का चुनाव करता है और कार्यों (या धागे) में पाए गए किसी भी घटना को प्रेषित करता है, वह कम प्रतिक्रियाशील होता है (क्योंकि यह केवल एक निश्चित अंतराल पर उपयोगकर्ता इनपुट में भाग लेता है)। फिर, यह यहां की बात की भावना है: कोई भी एक बहुत ही कम स्तर पर एक प्रणाली में तेजी से मतदान अंतराल के साथ एक मतदान कार्यान्वयन की कल्पना कर सकता है और इसके शीर्ष पर एक प्रतिक्रियात्मक फैशन में कार्यक्रम।


पिछले उत्तरों के मुताबिक, ऐसा लगता है कि गणितीय रूप से, हम बस एक उच्च क्रम में सोचते हैं। टाइप एक्स वाले मान x को सोचने के बजाय, हम एक फ़ंक्शन x : टीएक्स के बारे में सोचते हैं, जहां टी समय का प्रकार है, चाहे वह प्राकृतिक संख्याएं हों, पूर्णांक या निरंतरता हो। अब जब हम प्रोग्रामिंग भाषा में y : = x + 1 लिखते हैं, तो हम वास्तव में समीकरण y ( t ) = x ( t ) + 1 का अर्थ देते हैं।


पॉल हुडक की पुस्तक, द हास्केल स्कूल ऑफ एक्सप्रेशन , न केवल हास्केल के लिए एक अच्छा परिचय है, बल्कि यह एफआरपी पर काफी समय बिताता है। यदि आप एफआरपी के साथ शुरुआत कर रहे हैं, तो मैं आपको यह सलाह देता हूं कि एफआरपी कैसे काम करता है।

इस पुस्तक के एक नए पुनर्लेख की तरह दिखता है (2011 जारी किया गया, 2014 अपडेट किया गया), द हास्केल स्कूल ऑफ म्यूजिक


मुझे एफआरपी के बारे में क्लोजर सब्रेडडिट पर यह अच्छा वीडियो मिला। अगर आप क्लोजर नहीं जानते हैं तो भी समझना बहुत आसान है।

यहां वीडियो है: http://www.youtube.com/watch?v=nket0K1RXU4

वीडियो का अर्थ यह है कि वीडियो दूसरे छमाही में संदर्भित करता है: https://github.com/Cicayda/yolk-examples/blob/master/src/yolk_examples/client/autocomplete.cljs


मेरे लिए यह प्रतीक के लगभग 2 अलग-अलग अर्थ हैं =

  1. गणित x = sin(t) अर्थ है, कि x sin(t) लिए अलग नाम है । तो x + y लिखना sin(t) + y जैसा ही है। कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग इस संबंध में गणित की तरह है: यदि आप x + y लिखते हैं, तो इसका उपयोग किसी भी समय t के मूल्य के साथ किया जाता है जब इसका उपयोग किया जाता है।
  2. सी-जैसी प्रोग्रामिंग भाषाओं (अनिवार्य भाषाओं) में, x = sin(t) एक असाइनमेंट है: इसका मतलब है कि x असाइनमेंट के समय ली गई sin(t) के मूल्य को संग्रहीत करता है।

यह समय के साथ गणितीय डेटा परिवर्तन के बारे में है (या समय को अनदेखा कर रहा है)।

कोड में इसका मतलब कार्यात्मक शुद्धता और घोषणात्मक प्रोग्रामिंग है।

राज्य कीड़े मानक अनिवार्य प्रतिमान में एक बड़ी समस्या है। कोड निष्पादन में विभिन्न "बिट्स" पर कोड के विभिन्न बिट कुछ साझा राज्य को बदल सकते हैं। इससे निपटना मुश्किल है।

एफआरपी में आप वर्णन करते हैं (जैसे घोषणात्मक प्रोग्रामिंग में) डेटा एक राज्य से दूसरे में कैसे बदलता है और यह क्या ट्रिगर करता है। यह आपको समय को अनदेखा करने की अनुमति देता है क्योंकि आपका फ़ंक्शन बस अपने इनपुट पर प्रतिक्रिया कर रहा है और एक नया निर्माण करने के लिए अपने वर्तमान मूल्यों का उपयोग कर रहा है। इसका मतलब है कि राज्य परिवर्तन नोड्स के ग्राफ (या पेड़) में निहित है और कार्यात्मक रूप से शुद्ध है।

यह जटिलता और डीबगिंग समय को बड़े पैमाने पर कम कर देता है।

एक प्रोग्राम में गणित में ए = बी + सी और ए = बी + सी के बीच अंतर के बारे में सोचें। गणित में आप एक ऐसे रिश्ते का वर्णन कर रहे हैं जो कभी नहीं बदलेगा। एक कार्यक्रम में, इसका कहना है कि "अभी अभी" ए बी + सी है। लेकिन अगला आदेश बी ++ हो सकता है जिसमें ए ए बी + सी के बराबर नहीं है। गणित या घोषणात्मक प्रोग्रामिंग ए में हमेशा बी + सी के बराबर होगा, इससे कोई फर्क नहीं पड़ता कि आप किस समय पूछते हैं।

तो साझा राज्य की जटिलताओं को हटाकर और समय के साथ बदलते मूल्यों को हटाकर। आप के बारे में तर्क करना बहुत आसान है।

एक इवेंटस्ट्रीम एक इवेंटस्ट्रीम + कुछ परिवर्तन समारोह है।

एक व्यवहार एक EventStream + स्मृति में कुछ मूल्य है।

जब घटना आग लगती है तो रूपांतरण फ़ंक्शन चलाकर मूल्य अपडेट किया जाता है। यह मान जो व्यवहार करता है वह व्यवहार स्मृति में संग्रहीत होता है।

व्यवहारों को नए व्यवहारों के निर्माण के लिए बनाया जा सकता है जो एन अन्य व्यवहारों में परिवर्तन हैं। यह रचित मूल्य इनपुट घटनाओं (व्यवहार) आग के रूप में पुन: गणना करेगा।

"चूंकि पर्यवेक्षक स्टेटलेस हैं, इसलिए हमें अक्सर उनमें से कई को ड्रैग उदाहरण के रूप में एक राज्य मशीन अनुकरण करने की आवश्यकता होती है। हमें उस राज्य को सहेजना है जहां यह उपरोक्त चर पथ में शामिल सभी पर्यवेक्षकों के लिए सुलभ है।"

उद्धरण - पर्यवेक्षक पैटर्न को अस्वीकार करना http://infoscience.epfl.ch/record/148043/files/DeprecatingObserversTR2010.pdf


यह सोचने के बारे में पहली अंतर्ज्ञान तक पहुंचने का एक आसान तरीका यह है कि आपका प्रोग्राम एक स्प्रेडशीट है और आपके सभी चर सेल हैं। यदि किसी स्प्रेडशीट में से किसी भी कक्ष में परिवर्तन होता है, तो उस कक्ष को संदर्भित करने वाले किसी भी कक्ष को भी बदलता है। यह एफआरपी के साथ ही वही है। अब कल्पना करें कि कुछ कोशिकाएं स्वयं पर बदलती हैं (या बल्कि, बाहरी दुनिया से ली जाती हैं): एक जीयूआई स्थिति में, माउस की स्थिति एक अच्छा उदाहरण होगा।

यह जरूरी है कि वे बहुत ज्यादा याद करते हैं। जब आप वास्तव में एक एफआरपी प्रणाली का उपयोग करते हैं तो रूपक बहुत तेजी से टूट जाता है। एक के लिए, आमतौर पर अलग-अलग घटनाओं को मॉडल करने का प्रयास भी होता है (उदाहरण के लिए माउस क्लिक किया जा रहा है)। मैं केवल यह आपको यह बताने के लिए यहां डाल रहा हूं कि यह कैसा है।





frp