क्या कार्यात्मक जीयूआई प्रोग्रामिंग संभव है? [बन्द है]


404

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

एक क्षेत्र जहां वर्तमान एफपी सपाट लगता है, हालांकि, जीयूआई प्रोग्रामिंग है। हास्केल दृष्टिकोण बस अनिवार्य जीयूआई टूलकिट (जैसे जीटीके + या wxWidgets) को लपेटने और एक अनिवार्य शैली का अनुकरण करने के लिए "डू" ब्लॉकों का उपयोग करने के लिए लगता है। मैंने F # का उपयोग नहीं किया है, लेकिन मेरी समझ यह है कि यह .NET क्लास के साथ OOP का उपयोग करके कुछ ऐसा ही करता है। जाहिर है, इसके लिए एक अच्छा कारण है - वर्तमान जीयूआई प्रोग्रामिंग सभी आईओ और साइड इफेक्ट्स के बारे में है, इसलिए अधिकांश वर्तमान रूपरेखाओं के साथ विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग संभव नहीं है।

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


7
कॉमन लिस्प और ओकेएमएल में जीयूआई को देखने के बाद, मैं कहूंगा कि अधिक संभावना है, इसके हास्केल का आलस्य इस मुद्दे का कारण बन रहा है।
new123456

5
@ new123456 आम लिस्प हालांकि एक कार्यात्मक भाषा नहीं है, यह परस्पर डेटा के साथ काम करती है और साइड इफेक्ट्स को गले लगाती है
इलेक्ट्रिक कॉफ़ी

3
@ElectricCfish लिस्प एक बहुत ही लचीली भाषा है जो कई अलग-अलग शैलियों में इस्तेमाल की जा सकती है, और कई लोग कार्यात्मक शैली में लिस्प का उपयोग करने का विकल्प चुनते हैं।
chrismamo1

7
मेरे अनुभव से (हालांकि मैं अभी भी इस पर विश्वास करने और अधिक सीखने की कोशिश कर रहा हूं) एफआरपी वास्तव में जीयूआई प्रोग्रामिंग के साथ अपनी सीमा तक पहुंचता है; उपयोग के मामलों के 80% के लिए यह अच्छा और सुरुचिपूर्ण है, लेकिन समृद्ध विगेट्स को अपने आंतरिक राज्य (जैसे खोज कॉम्बो बॉक्स, आदि) के बहुत सटीक नियंत्रण की आवश्यकता होती है और एफआरपी बस रास्ते में मिलता है। सदैव बुराई नहीं होती है; अनिवार्य कोड की मात्रा को कम करने की कोशिश करना अच्छा है लेकिन इसमें से 100% को हटा देना चाहिए? अभी तक इसे गैर तुच्छ यूआई विकास के लिए काम करते देखना है।
एलेक्स

8
@ElectricCfish "आम लिस्प हालांकि एक कार्यात्मक भाषा नहीं है"। लिस्प सभी कार्यात्मक भाषाओं की जननी है। आपका मतलब है कि लिस्प शुद्ध नहीं है।
जॉन हैरोप

जवाबों:


183

हास्केल दृष्टिकोण केवल अनिवार्य GUI टूलकिट (जैसे GTK + या wxWidgets) को लपेटने और एक अनिवार्य शैली का अनुकरण करने के लिए "डू" ब्लॉकों का उपयोग करने के लिए लगता है।

यह वास्तव में "हास्केल दृष्टिकोण" नहीं है - यही कारण है कि कैसे आप अनिवार्य जीयूआई टूलकिट्स को सीधे बांधते हैं - एक अपूर्ण इंटरफ़ेस के माध्यम से। हास्केल बस काफी प्रमुख बाइंडिंग होता है।

GUIs में कई मध्यम परिपक्व, या अधिक प्रयोगात्मक विशुद्ध रूप से कार्यात्मक / घोषणात्मक दृष्टिकोण हैं, ज्यादातर हास्केल में, और मुख्य रूप से कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का उपयोग करते हुए।

कुछ उदाहरण निम्न हैं:

आपमें से जो हास्केल, फ्लैपजैक्स, http://www.flapjax-lang.org/ से परिचित नहीं हैं, उनके लिए जावास्क्रिप्ट के शीर्ष पर कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का कार्यान्वयन है।


32
फलों के बारे में कॉनएल इलियट के पेपर में तकनीक और निर्णयों के एक शानदार, गहन वर्णन के लिए देखें: conal.net/papers/genuinely-functional-guis.pdf मैं कुछ महीनों से इस शैली में विशुद्ध रूप से कार्यात्मक जीयूआई प्रोग्रामिंग कर रहा हूं। । मैं इसे प्यार करता हूं, यह अनिवार्य यूआई प्रोग्रामिंग के स्पेगेटी नरक से एक ऐसी सुखद राहत है, जो कि सबसे जरूरी प्रोग्रामिंग की तुलना में इस संबंध में बदतर लगता है।
ल्यूकी

44
मैं इससे 100% सहमत हूं। इसे स्पष्ट करने के लिए: मौजूदा जीयूआई टूलकिट का उपयोग अक्सर इसलिए किया जाता है क्योंकि वे मौजूद हैं। इसका कारण यह है कि उनके लिए इंटरफेस अनिवार्य और अशुद्ध होते हैं क्योंकि टूलकिट्स अनिवार्य और अशुद्ध होते हैं। टूलकिट्स आवधिक और अशुद्ध होने का कारण है क्योंकि ऑपरेटिंग सिस्टम वे निर्भर करते हैं जो आवधिक और अशुद्ध होते हैं। हालाँकि, इनमें से किसी को भी मूल रूप से अशुद्ध होने की आवश्यकता नहीं है: उन टूलकिट के लिए कार्यात्मक बाइंडिंग हैं, कार्यात्मक टूलकिट हैं, यहां तक ​​कि कार्यात्मक ऑपरेटिंग सिस्टम भी हैं।
जोर्ग डब्ल्यू मित्तग

16
यह सब सिर्फ आलस्य की बात है। (बुरी सजा का इरादा।)
जोर्ग डब्ल्यू मित्तग

10
किसी दिन सभी GUI डिज़ाइन WYSIWYG के माध्यम से कार्यान्वित किए जाएंगे, तर्क के साथ कार्यात्मक रूप से लागू किए जाएंगे। यह मेरी भविष्यवाणी है।
ब्लूराजा - डैनी पफ्लुघोफ्ट

23
कागज luqui उल्लेख मृत प्रतीत होता है। कॉनल इलियट की साइट पर एक काम करने वाला लिंक है, हालांकि: conal.net/papers/genuinely-functional-guis.pdf
aganders3

74

मेरा सवाल यह है कि क्या जीयूआई प्रोग्रामिंग के लिए एक कार्यात्मक दृष्टिकोण रखना संभव है?

आपके लिए महत्वपूर्ण शब्द "कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग" (FRP) हैं।

कॉनल इलियट और कुछ अन्य लोगों ने एफआरपी के लिए सही अमूर्तता खोजने की कोशिश में एक कुटीर उद्योग का एक सा बना दिया है। हास्केल में एफआरपी अवधारणाओं के कई कार्यान्वयन हैं।

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

GUI विकास के लिए इस दृष्टिकोण का उपयोग कैसे किया जा सकता है, इसके बारे में जानने के लिए , आप Fudgets को देखना चाहते हैं , जो कि इन दिनों दाँत में थोड़ा लंबा हो रहा है, 90 के दशक के मध्य में बनाया जा रहा है, एक ठोस FRP दृष्टिकोण प्रस्तुत करता है GUI डिजाइन करने के लिए।


मैं "रिएक्टिव एक्सटेंशन्स" (एफआरपी लाइब्रेरीज़; हालांकि एफपी नहीं) के उपयोग के उदय को जोड़ना चाहता हूं, जो मूल रूप से सी # के लिए लिखा गया था और फिर जावा (आरएक्सजेवा) और जावास्क्रिप्ट (आरएक्सजेएस) और विभिन्न भाषाओं में पोर्ट किया गया था। प्रतिक्रियाशील x की जाँच करें। बिंदु के अनुसार, कोणीय 2 RxJS का व्यापक उपयोग करता है।
srph

63

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

WPF XAML में उपयोगकर्ता इंटरफ़ेस का वर्णन करता है (हालाँकि आप इसे कार्यात्मक रूप से C # या F # भी देख सकते हैं), इसलिए कुछ उपयोगकर्ता इंटरफ़ेस बनाने के लिए जो आप लिखेंगे:

<!-- Declarative user interface in WPF and XAML --> 
<Canvas Background="Black">
   <Ellipse x:Name="greenEllipse" Width="75" Height="75" 
      Canvas.Left="0" Canvas.Top="0" Fill="LightGreen" />
</Canvas>

इसके अलावा, WPF आपको घोषणात्मक टैग के एक और सेट का उपयोग करके घटनाओं के लिए एनिमेशन और प्रतिक्रियाओं का वर्णन करने की अनुमति देता है (फिर से, यही बात C # / F # कोड के रूप में लिखी जा सकती है):

<DoubleAnimation
   Storyboard.TargetName="greenEllipse" 
   Storyboard.TargetProperty="(Canvas.Left)"
   From="0.0" To="100.0" Duration="0:0:5" />

वास्तव में, मुझे लगता है कि WPF में हास्केल के FRP के साथ आम तौर पर कई चीजें हैं (हालांकि मेरा मानना ​​है कि WPF डिजाइनरों को FRP के बारे में नहीं पता था और यह थोड़ा दुर्भाग्यपूर्ण है - यदि आप कार्यात्मक का उपयोग कर रहे हैं तो WPF कभी-कभी थोड़ा अजीब और अस्पष्ट लगता है। दृष्टिकोण)।


12
जबकि XAML प्रकृति में बहुत ही घोषणात्मक है, क्या MVVM वास्तव में प्रोग्रामिंग की एक कार्यात्मक शैली को प्रोत्साहित करता है? एक दृश्य मॉडल की पूरी धारणा, जिसका काम दृश्य की स्थिति को ट्रैक करना है (और INotifyPropertyChangedसभी चीजों के एक इंटरफ़ेस को लागू करता है ), मुझे एफपी के लिए एंटीथेटिकल लगता है। मैं निश्चित रूप से एफपी पर कोई विशेषज्ञ नहीं हूं, और शायद मैं घोषणात्मक पहलू के विपरीत अपरिवर्तनीयता पहलू पर बहुत अधिक ध्यान केंद्रित कर रहा हूं, लेकिन मुझे यह देखने में परेशानी हो रही है कि एमवीवीएम पैटर्न (आमतौर पर इस्तेमाल किया गया) एफपी का एक उदाहरण है।
देवकर

1
@ देवदूत मैं यह तर्क दूंगा कि यह करता है। मुझे नहीं लगता कि सख्त अपरिवर्तनीय कोड के लिए कोई भी वास्तविक रूप से FP का उपयोग करेगा। इसके बजाय, आप तय करते हैं कि आपकी परिवर्तनशीलता की सीमाएं कहां हैं, और अन्य सभी स्तरों पर अपरिवर्तनीय काम करते हैं - इस मामले में, हर कोई यह मान सकता है कि राज्य अपरिवर्तनीय है, केवल उस छोटे से हिस्से को छोड़कर जो राज्य को उत्परिवर्तित करता है। यह HTML के काम करने के तरीके के समान है - हाँ, आपको अपरिवर्तनीय DOM मिल गया है, लेकिन जब भी आप नेविगेट करते हैं, तब भी आपको एक नया निर्माण करना होगा। INotifyPropertyChangedजीयूआई अपडेट को संभालने के लिए आपको जहां भी जरूरत है, बस एक अपडेट फंक्शन है - यह एक विलंबता फिक्स है।
लुआं

3
स्टीवन पेम्बर्टन ने F # और WPF पर 2 महान पोस्ट लिखे , दूसरे पोस्ट के अंत में F # के साथ WPF विकास पर उनके विचार इस चर्चा में शामिल हुए। 2 अन्य उदाहरणों ने भी मुझे परेशान किया, एमवीवीएम चालित एमवीवीएम में एक कार्यात्मक नियंत्रक का उपयोग और फ्लाइंग मेंढक परामर्श द्वारा WPF नियंत्रण डेमो में एक सरल इंटरफ़ेस के निर्माण के लिए विभेदित यूनियनों और पुनरावृत्ति का उपयोग किया गया था ।
फंक

29

मैं वास्तव में कहूंगा कि कार्यात्मक प्रोग्रामिंग (F #) उपयोगकर्ता इंटरफ़ेस प्रोग्रामिंग के लिए उदाहरण C # की तुलना में बहुत बेहतर उपकरण है। आपको बस समस्या के बारे में थोड़ा अलग तरीके से सोचने की जरूरत है।

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

let rec drawingLoop(clr, from) = async { 
   // Wait for the first MouseMove occurrence 
   let! move = Async.AwaitObservable(form.MouseMove) 
   if (move.Button &&& MouseButtons.Left) = MouseButtons.Left then 
      // Refresh the window & continue looping 
      drawRectangle(clr, from, (move.X, move.Y)) 
      return! drawingLoop(clr, from) 
   else
      // Return the end position of rectangle 
      return (move.X, move.Y) } 

let waitingLoop() = async { 
   while true do
      // Wait until the user starts drawing next rectangle
      let! down = Async.AwaitObservable(form.MouseDown) 
      let downPos = (down.X, down.Y) 
      if (down.Button &&& MouseButtons.Left) = MouseButtons.Left then 
         // Wait for the end point of the rectangle
         let! upPos = drawingLoop(Color.IndianRed, downPos) 
         do printfn "Drawn rectangle (%A, %A)" downPos upPos }

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

फ़ंक्शनल रिएक्टिव प्रोग्रामिंग एक अधिक कार्यात्मक दृष्टिकोण है, लेकिन मुझे इसका उपयोग करने के लिए कुछ हद तक कठिन लगता है क्योंकि यह काफी उन्नत हास्केल सुविधाओं (जैसे तीर) पर निर्भर करता है। हालांकि, बड़ी संख्या में मामलों में यह बहुत ही सुंदर है। यह सीमा है कि आप आसानी से एक राज्य मशीन (जो प्रतिक्रियाशील कार्यक्रमों के लिए एक उपयोगी मानसिक मॉडल है) को एनकोड नहीं कर सकते। ऊपर F # तकनीक का उपयोग करके यह बहुत आसान है।


7
+1 यह हमारे अनुभव को दर्शाता है, एफ # में कई प्रोडक्शन GUI लिखा है और कॉम्बिनेटर लाइब्रेरीज़ का उपयोग कर रहे हैं IObservable
जॉन हैरोप

क्या .NET लाइब्रेरी में प्रतिक्रियात्मक एक्सटेंशन की शुरुआत के बाद से FRP पर टिप्पणी बदल गई है?
Fsharp पीट

1
यहां एरोइज्ड एफआरपी पर कुछ शोध किए गए हैं और कैसे प्रभाव और उत्परिवर्तन को कानूनों को तोड़ने के बिना एरोइज्ड एफआरपी के भीतर एम्बेड किया जा सकता है: haskell.cs.yale.edu/wp-content/uploads/2015/10/… (btw सबसे एफआरपी लाइब्रेरी मोनॉड्स का उपयोग करें या यहां तक ​​कि आवेदक, इसलिए यह सही नहीं है कि तीर की आवश्यकता है)।
एरिक कपलुन

17

चाहे आप F # या OCaml जैसी हाइब्रिड फ़ंक्शनल / OO लैंग्वेज में हों या Haskell जैसी विशुद्ध फ़ंक्शनल लैंग्वेज में, जहाँ IO सनक के साइड-इफ़ेक्ट्स को फिर से लागू किया जाता है, यह ज्यादातर मामला है कि GUI को प्रबंधित करने के लिए आवश्यक कार्य का एक टन विशुद्ध रूप से कार्यात्मक एल्गोरिथ्म की तुलना में "साइड इफेक्ट" की तरह बहुत अधिक है।

उस ने कहा, कार्यात्मक GUI में कुछ वास्तव में ठोस अनुसंधान किया गया है । यहां तक ​​कि कुछ (ज्यादातर) कार्यात्मक टूलकिट जैसे कि फ़्यूजेट्स या फ्रेंक भी हैं


6
"कार्यात्मक GUIs" लिंक टूट गया :( कैशेड: webcache.googleusercontent.com/search?q=cache:http://…
Dan Burton

15

आप F # पर डॉन सीमे द्वारा श्रृंखला की जाँच कर सकते हैं जहाँ वह डेमो बना रहा है। निम्नलिखित लिंक श्रृंखला के तीसरे भाग के लिए है (आप वहां से अन्य दो भागों में लिंक कर सकते हैं)।

WPF विकास के लिए F # का उपयोग करना एक बहुत ही रोचक GUI प्रतिमान होगा ...

http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to-F-3-of-3/


12

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

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

http://www.cs.nott.ac.uk/~nhn/Talks/HW2003-YampaArcade.pdf (स्लाइड, पीडीएफ) http://www.cs.nott.ac.uk/~nhn/Publications/hit2003। पीडीएफ (पूरा लेख, पीडीएफ)

Yaska पर Haskell.org पर एक विकी पेज है

http://www.haskell.org/haskellwiki/Yampa

मूल यमपा मुख पृष्ठ:

http://www.haskell.org/yampa (दुर्भाग्य से इस समय टूट गया है)


1
वह लिंक लंबे समय से टूटा हुआ है। इस यमपा की
CoR

7

चूंकि यह सवाल पहली बार पूछा गया था, एल्म द्वारा कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग को थोड़ा अधिक मुख्यधारा बनाया गया है।

मैं http://elm-lang.org पर इसकी जाँच करने का सुझाव देता हूं , जिसमें पूरी तरह कार्यात्मक इन-ब्राउज़र जीयूआई बनाने के तरीके पर कुछ उत्कृष्ट इंटरैक्टिव ट्यूटोरियल भी हैं।

यह आपको पूरी तरह से कार्यात्मक जीयूआई बनाने की अनुमति देता है, जहां कोड आपको खुद को आपूर्ति करने की आवश्यकता होती है, जिसमें केवल शुद्ध कार्य होते हैं। मैंने व्यक्तिगत रूप से विभिन्न हास्केल जीयूआई फ्रेमवर्क की तुलना में इसे प्राप्त करना बहुत आसान पाया।



6

एफआरपी पर इलियट की बात यहां मिल सकती है

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

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

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

इसलिए पारंपरिक एफपी में एक समय स्वतंत्र कार्यों का उपयोग करता है, जबकि एफआरपी में एक कार्यक्रम का वर्णन करने के लिए बिल्डिंग ब्लॉक के रूप में समय निर्भर कार्यों का उपयोग किया जाता है।

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

एफआरपी में इस अनुकार कार्यक्रम का वर्णन करना (मेरी समझ के अनुसार) एक एकल अंतर समीकरण (घोषित रूप से) द्वारा किया जाता है: त्वरण * द्रव्यमान = - वसंत का खिंचाव * वसंत निरंतर + बल उपयोगकर्ता द्वारा निष्पादित।

यहां ELM पर एक वीडियो है जो इस दृष्टिकोण को दिखाता है।


5

2016 तक, हास्केल के लिए सोडियम और रिफ्लेक्स (लेकिन साथ ही नेटवायर) जैसे कई और अधिक अपेक्षाकृत एफआरपी फ्रेमवर्क हैं।

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

Arrowized FRP पर एक हालिया पेपर और साइड इफेक्ट्स को शामिल करने की संभावना, IO और कानून का पालन करने में उत्परिवर्तन, शुद्ध FRP सेटिंग: http://haskell.cs.yale.edu/wp-content/upds/2015/10/ DWC-येल प्रारूपित-dissertation.pdf

यह भी ध्यान देने योग्य है कि जावास्क्रिप्ट फ्रेमवर्क जैसे कि रिएक्टजेएस और एंगुलर और कई अन्य या तो पहले से ही हैं या स्केलेबल और कंपोज़ेबल जीयूआई घटकों को प्राप्त करने के लिए एफआरपी या अन्यथा कार्यात्मक दृष्टिकोण का उपयोग करने की ओर बढ़ रहे हैं।


सोडियम के प्रतिक्रियाशील केले के पक्ष में सोडियम को हटा दिया गया है
mac10688

4

XUL जैसी मार्कअप भाषाएं आपको घोषणात्मक तरीके से GUI बनाने की अनुमति देती हैं।


3

इसे संबोधित करने के लिए मैंने F # का उपयोग करते हुए अपने कुछ विचार पोस्ट किए,

http://fadsworld.wordpress.com/2011/04/13/f-in-the-enterprise-i/ http://fadsworld.wordpress.com/2011/04/17/fin-the-enterprise-ii- 2 /

मैं श्रृंखला समाप्त करने के लिए एक वीडियो ट्यूटोरियल करने की योजना भी बना रहा हूं और दिखाता हूं कि F # UX प्रोग्रामिंग में कैसे योगदान दे सकता है।

मैं यहां केवल F # के संदर्भ में बात कर रहा हूं।

-Fahad


2

इन सभी अन्य जवाबों को कार्यात्मक प्रोग्रामिंग पर बनाया गया है, लेकिन अपने स्वयं के डिजाइन के बहुत सारे निर्णय लेते हैं। एक पुस्तकालय जो मूल रूप से कार्यों और सरल सार डेटा प्रकारों से पूरी तरह से बनाया गया है gloss। यहाँ playस्रोत से इसके कार्य के लिए प्रकार है

-- | Play a game in a window. Like `simulate`, but you manage your own input events.
play    :: Display              -- ^ Display mode.
        -> Color                -- ^ Background color.
        -> Int                  -- ^ Number of simulation steps to take for each second of real time.
        -> world                -- ^ The initial world.
        -> (world -> Picture)   -- ^ A function to convert the world a picture.
        -> (Event -> world -> world)    
                -- ^ A function to handle input events.
        -> (Float -> world -> world)
                -- ^ A function to step the world one iteration.
                --   It is passed the period of time (in seconds) needing to be advanced.
        -> IO ()

जैसा कि आप देख सकते हैं, यह पूरी तरह से सरल अमूर्त प्रकारों के साथ शुद्ध कार्यों की आपूर्ति करके काम करता है, जो अन्य पुस्तकालय आपकी सहायता करते हैं।


1

हास्केल के लिए नए लोगों द्वारा देखा गया सबसे स्पष्ट नवाचार यह है कि अशुद्ध दुनिया के बीच एक अलगाव है जो बाहरी दुनिया के साथ संचार करने और कम्प्यूटेशन और एल्गोरिदम की शुद्ध दुनिया से संबंधित है। एक लगातार शुरुआत सवाल "मैं कैसे से छुटकारा पा सकते है IO, यानी, धर्मांतरित IO aमें a?" इसका तरीका यह है कि कोड लिखने के लिए मठों (या अन्य अमूर्तनों) का उपयोग किया जाता है जो आईओ और चेन प्रभाव करता है। यह कोड बाहरी दुनिया से डेटा इकट्ठा करता है, इसका एक मॉडल बनाता है, कुछ संगणना करता है, संभवतः शुद्ध कोड को नियोजित करके, और परिणाम को आउटपुट करता है।

जहां तक ​​उपरोक्त मॉडल का संबंध है, मुझे मोनाड में GUIs में हेरफेर करने के साथ कुछ भी गलत नहीं दिखता है IO। इस शैली से उत्पन्न सबसे बड़ी समस्या यह है कि मॉड्यूल अब रचना करने योग्य नहीं हैं, यानी, मैं अपने कार्यक्रम में वैश्विक निष्पादन आदेश के बारे में अपना अधिकांश ज्ञान खो देता हूं। इसे ठीक करने के लिए, मुझे समवर्ती, अनिवार्य जीयूआई कोड के समान तर्क लागू करना होगा। इस बीच, अशुद्ध के लिए, गैर-जीयूआई कोड निष्पादन आदेश स्पष्ट है क्योंकि IOमोनड के >==ऑपरेटर की परिभाषा (कम से कम जब तक केवल एक धागा है)। शुद्ध कोड के लिए, यह बिल्कुल भी मायने नहीं रखता है, सिवाय इसके कि कोने के मामलों में प्रदर्शन को बढ़ाया जा सके या इसके परिणामस्वरूप मूल्यांकन से बचा जा सके

कंसोल और ग्राफिकल IO के बीच सबसे बड़ा दार्शनिक अंतर यह है कि पूर्व को लागू करने वाले प्रोग्राम आमतौर पर सिंक्रोनस शैली में लिखे जाते हैं। यह संभव है क्योंकि वहाँ (एक तरफ संकेतों और अन्य खुले फ़ाइल विवरणों को छोड़कर) घटनाओं का सिर्फ एक स्रोत है: बाइट स्ट्रीम जिसे आमतौर पर कहा जाता है stdin। जीयूआई स्वाभाविक रूप से अतुल्यकालिक हैं, और कीबोर्ड की घटनाओं और माउस क्लिक पर प्रतिक्रिया करना है।

कार्यात्मक तरीके से अतुल्यकालिक IO करने के एक लोकप्रिय दर्शन को कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग (FRP) कहा जाता है। इसने हाल ही में अशुद्ध, गैर-कार्यात्मक भाषाओं के लिए बहुत अधिक कर्षण प्राप्त किया, जो कि रिएक्टिवएक्स जैसे पुस्तकालयों और एल्म जैसी रूपरेखाओं के लिए धन्यवाद । संक्षेप में, यह GUI तत्वों और अन्य चीजों (जैसे कि फ़ाइलें, घड़ियां, अलार्म, कीबोर्ड, माउस) को इवेंट स्रोतों के रूप में देखने के समान है, जिन्हें "वेधशाला" कहा जाता है, जो घटनाओं की धाराओं का उत्सर्जन करते हैं। इन घटनाओं परिचित ऑपरेटर्स का उपयोग इस तरह के रूप संयोजित किया जाता है map, foldl, zip, filter, concat, join, आदि, नई धाराओं का उत्पादन करने के लिए। यह उपयोगी है क्योंकि कार्यक्रम राज्य को कार्यक्रम के रूप scanl . map reactToEvents $ zipN <eventStreams>में देखा जा सकता है , जहांN कार्यक्रम द्वारा कभी देखे गए पर्यवेक्षकों की संख्या के बराबर है।

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


-22

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


25
मुझे लगता है कि आपने इस बात को गलत समझा है: ऐसा नहीं है कि कार्यात्मक प्रोग्रामिंग का दुनिया पर कोई बाहरी प्रभाव नहीं है - जो सभी कार्यक्रमों को पूरी तरह से बेकार कर देगा! बल्कि, कार्यात्मक प्रोग्रामिंग आपको IO को संगरोध करने देता है ताकि आप जान सकें कि कौन सा बिट्स इसका उपयोग करता है और कौन सा बिट्स नहीं।
तिखन जेल्विस

Whoooooooosh x20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.