एफआरपी के बारे में कई पेज पढ़ने के बाद आखिरकार मैं एफआरपी के बारे में इस ज्ञानवर्धक लेखन के बारे में आया , इसने आखिरकार मुझे समझा कि एफआरपी वास्तव में क्या है।
मैं हेनरिक एपेलमस (प्रतिक्रियाशील केले के लेखक) के नीचे बोली लगाता हूं।
कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का सार क्या है?
एक आम जवाब यह होगा कि "एफआरपी एक प्रणाली का वर्णन करने योग्य समय के बजाय समय-भिन्न कार्यों के संदर्भ में एक प्रणाली है", और यह निश्चित रूप से गलत नहीं होगा। यह शब्दार्थ है। लेकिन मेरी राय में, अधिक विशुद्ध रूप से संतोषजनक उत्तर निम्नलिखित विशुद्ध रूप से वाक्यगत कसौटी द्वारा दिया गया है:
कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का सार घोषणा के समय पूरी तरह से एक मूल्य के गतिशील व्यवहार को निर्दिष्ट करना है।
उदाहरण के लिए, एक काउंटर का उदाहरण लें: आपके पास "अप" और "डाउन" लेबल वाले दो बटन हैं जिनका उपयोग काउंटर को बढ़ाने या घटाने के लिए किया जा सकता है। Imperatively, आप पहले एक प्रारंभिक मान निर्दिष्ट करेंगे और फिर जब भी कोई बटन दबाया जाता है तो उसे बदल सकते हैं; कुछ इस तरह:
counter := 0 -- initial value
on buttonUp = (counter := counter + 1) -- change it later
on buttonDown = (counter := counter - 1)
मुद्दा यह है कि घोषणा के समय, काउंटर के लिए केवल प्रारंभिक मूल्य निर्दिष्ट किया गया है; काउंटर का गतिशील व्यवहार कार्यक्रम के बाकी हिस्सों में निहित है। इसके विपरीत, कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग इस तरह की घोषणा के समय पूरे गतिशील व्यवहार को निर्दिष्ट करती है:
counter :: Behavior Int
counter = accumulate ($) 0
(fmap (+1) eventUp
`union` fmap (subtract 1) eventDown)
जब भी आप काउंटर की गतिशीलता को समझना चाहते हैं, तो आपको केवल इसकी परिभाषा को देखना होगा। जो कुछ भी हो सकता है वह दाएं हाथ की तरफ दिखाई देगा। यह अनिवार्य दृष्टिकोण के विपरीत बहुत अधिक है जहां बाद की घोषणाएं पहले घोषित मूल्यों के गतिशील व्यवहार को बदल सकती हैं।
इसलिए, मेरी समझ में एक एफआरपी कार्यक्रम समीकरणों का एक सेट है:
j
असतत है: 1,2,3,4 ...
f
इस पर निर्भर करता है t
कि यह बाहरी उत्तेजनाओं को मॉडल करने के लिए ओस्टेबिल्टी को शामिल करता है
कार्यक्रम के सभी राज्य को चरों में समझाया जाता है x_i
एफआरपी पुस्तकालय प्रगति समय का ध्यान रखता है, दूसरे शब्दों में, लेने के j
लिए j+1
।
मैं इन समीकरणों को इस वीडियो में बहुत अधिक विस्तार से समझाता हूं ।
संपादित करें:
मूल उत्तर के लगभग 2 साल बाद, हाल ही में मैं इस नतीजे पर पहुंचा कि FRP कार्यान्वयन का एक और महत्वपूर्ण पहलू है। उन्हें (और आमतौर पर) एक महत्वपूर्ण व्यावहारिक समस्या को हल करने की आवश्यकता है: कैश अमान्य ।
समीकरणों के लिए x_i
-s एक निर्भरता ग्राफ का वर्णन करते हैं। जब x_i
समय पर कुछ परिवर्तन होते हैं j
तो अन्य सभी x_i'
मूल्यों को j+1
अद्यतन करने की आवश्यकता नहीं होती है, इसलिए सभी निर्भरताओं को पुनर्गणना की आवश्यकता नहीं होती है क्योंकि कुछ x_i'
से स्वतंत्र हो सकते हैं x_i
।
इसके अलावा, x_i
-s जो परिवर्तन करते हैं , उन्हें आकस्मिक रूप से अपडेट किया जा सकता है। उदाहरण के लिए के एक नक्शे के संचालन पर विचार करते हैं f=g.map(_+1)
स्काला, जहां में f
और g
कर रहे हैं List
के Ints
। यहाँ से f
मेल खाता है x_i(t_j)
और g
है x_j(t_j)
। अब अगर मैं किसी तत्व को प्रस्तुत करता हूं g
तो map
सभी तत्वों के लिए ऑपरेशन को अंजाम देना बेकार होगा g
। कुछ एफआरपी कार्यान्वयन (उदाहरण के लिए रिफ्लेक्स- एफआरपी ) का उद्देश्य इस समस्या को हल करना है। इस समस्या को वृद्धिशील कंप्यूटिंग के रूप में भी जाना जाता है ।
दूसरे शब्दों में, x_i
FRP में व्यवहार ( -s) को कैश-एड कम्प्यूटेशन के रूप में सोचा जा सकता है। एफआरपी इंजन का काम यह है कि x_i
अगर वे कुछ f_i
बदल जाते हैं , तो इन कैश-एस ( -s) को कुशलतापूर्वक अमान्य और पुनः स्थापित करना कार्य है।