सिमुलेशन और मॉडलिंग के लिए एफ.पी.


12

मैं एक सिमुलेशन / मॉडलिंग परियोजना शुरू करने वाला हूं। मुझे पहले से ही पता है कि ओओपी का इस्तेमाल इस तरह की परियोजनाओं के लिए किया जाता है। हालांकि, हास्केल के अध्ययन ने मुझे घटकों की एक प्रणाली के मॉडलिंग के लिए एफपी प्रतिमान का उपयोग करने पर विचार किया। मुझे विस्तार से बताएं:

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

यदि मुझे ओओपी दृष्टिकोण का उपयोग करना था, तो मैं दो ऑब्जेक्ट्स बनाऊंगा जो प्रत्येक प्रकार के डेटा को एन्क्रिप्ट करेगा, पीडीई को हल करने के तरीके (इनहेरिटेंस कोड कोड के लिए यहां उपयोग किया जाएगा) और पीडीई के समाधान।

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

निष्कर्ष निकालने के लिए, क्या एफपी दृष्टिकोण को लागू करना वास्तव में सरल और आसान होगा (ओ डी पी की तुलना में एक अलग प्रकार का घटक या pde को हल करने के लिए नई विधि जोड़ें)?

मैं एक C ++ / फोरट्रान पृष्ठभूमि से आता हूं, साथ ही मैं एक पेशेवर प्रोग्रामर नहीं हूं, इसलिए मुझे जो भी गलत मिला है, उस पर मुझे सुधारें।

जवाबों:


7

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

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

आपके प्रश्न पर एक और परिप्रेक्ष्य (काफी जवाब नहीं) इस थ्रेड को देखना है (अस्वीकरण, मैंने इसे शुरू किया) StackOverflow पर, कुछ उत्तर बहुत ही रोचक हैं: /programming/3431654/how-toes- कार्यात्मक-प्रोग्रामिंग से लागू करने के लिए सिमुलेशन

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


यह जानना अच्छा है कि मैं सिमुलेशन में OOP के बारे में केवल एक ही संदेह नहीं कर रहा हूं और मेरे प्रश्न का उत्तर देने के लिए धन्यवाद! मैंने एफपी पर जॉन कार्मैक की टिप्पणियों को पढ़ा था और मैंने सी ++ पर कुछ एफपी पहलुओं को लागू करने के बारे में सोचा था (वस्तुओं को कॉपी करना, या इनपुट को इकट्ठा करना और इसे एक समारोह में पास करना) लेकिन फिर मुझे नहीं पता कि मुझे सी ++ के साथ अपना प्रोजेक्ट शुरू करना चाहिए या नहीं एक FP भाषा के बजाय, Haskell की तरह, जैसे कि FP पहलू अंतर्निहित हैं और आप केवल तभी परिवर्तनशीलता व्यक्त करते हैं जब इसकी आवश्यकता होती है। क्या आपने सामान्य रूप से क्लोजर या एफपी का उपयोग जारी रखा, यह देखते हुए कि आपके पास एक समान समस्या / प्रश्न था?
०४

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

मैंने क्लोजर पर एक नज़र डाली है, लेकिन मैं यह नहीं कह सकता कि मैं एस-एक्सप्रेशन का शौकीन हूं। मुझे पता है कि यह व्यावहारिक है (लिस्प कोड डेटा है) लेकिन क्या इसका उपयोग करना आसान है?
हेप्टोबेस्क्वेयर

@heaptobesquare - एस-एक्सप्रेशन / लिस्प सिंटैक्स वास्तव में उपयोग करने के लिए बहुत आसान है; पहले एक अच्छा संपादक चुनें (Emacs or vim, मेरा वोट Emacs के लिए है, dev.clojure.org/display/doc/Getting+Started+with+Emacs ) देखें, जिसके पास क्लोएजोर की एक विधा है, एक अच्छी पुस्तक प्राप्त करें (जैसे प्रोग्रामिंग क्लीजुरे ), और हैकिंग शुरू करते हैं। कम से कम कुछ हफ्तों के बाद, सिंटैक्स पृष्ठभूमि में फीका हो जाएगा, जैसा कि यह होना चाहिए - यह इतनी पूरी तरह से सुसंगत है कि आप इसके बारे में बहुत कम बार सोचेंगे, और अधिक महत्वपूर्ण चीजों के लिए मानसिक चक्र मुक्त करेंगे। :)
सीमित

मैं निश्चित रूप से यह एक कोशिश दे दूँगा। लिस्प की समलैंगिकता आखिरकार दिलचस्प है।
२६ पर १२

2

उचित जटिलता के लगभग हर कार्य के लिए आईएमएचओ प्रश्न "एक एफपी शैली या ओओपी शैली बेहतर विकल्प है" जिसका उद्देश्य निष्पक्ष रूप से उत्तर नहीं दिया जा सकता है। आमतौर पर, ऐसी स्थिति में प्रश्न "एफपी या ओओपी" नहीं है, लेकिन आपकी समस्या को हल करने के लिए दोनों प्रतिमानों के सर्वोत्तम भागों को कैसे संयोजित किया जाए।

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

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


आपके उत्तर के लिए धन्यवाद! इसलिए, अगर मुझे C ++ का उपयोग करना है, तो किसी ऑब्जेक्ट के घटक के केवल डेटा (जो पैरामीटर, सीमा की स्थिति और मैट्रिक्स रूप में PDE है) को एन्कैप्सुलेट करना होगा और फ़ंक्शन को परिभाषित करेगा (यहां तक ​​कि कुछ उच्च-क्रम वाले, मामले में) पैरामीटर कुछ और का एक फ़ंक्शन है), ऑब्जेक्ट के दायरे के बाहर, जो ऑब्जेक्ट के डेटा पर काम करेगा, कुशल हो सकता है?
०५ पर १२

@heaptobesquare: ईमानदारी से, मैं आपको यह नहीं बता सकता कि क्या यह आपके मामले में कुशल होगा । इसे आजमाएं, बड़ा सोचें, छोटी शुरुआत करें। सबसे अच्छा क्या काम करता है और क्या नहीं, यह जानने के लिए कुछ "ट्रेसर कोड" ( artima.com/intv/tracer.html ) प्रोग्रामिंग शुरू करें । और अगर आप ऐसी स्थिति में आते हैं जहां आप नोटिस करते हैं कि कुछ ठीक से काम नहीं करता है, तो रिफ्लेक्टर।
डॉक्टर ब्राउन

हास्केल के पास हैमेट्रिक्स लाइब्रेरी है, जो BLAS / LAPACK लाइब्रेरी के लिए बाइंडिंग है, और इसके लिए एक बहुत अच्छा सिंटैक्स है, जिसे मैं व्यक्तिगत रूप से OOP दृष्टिकोण पर चुनूंगा।
पौल

@ अंपुल: धन्यवाद, मैं निश्चित रूप से इस पर एक नज़र डालूंगा! क्या हस्केल लाइब्रेरी आमतौर पर संगत और सामग्री में समृद्ध हैं? विकी कहते हैं लेकिन क्या यह एक सच्चाई है?
हेप्टोबोस्क्वेयर

@heaptobesquare: एकमात्र Haskell लाइब्रेरी जो मैंने किसी भी हद तक उपयोग की है, वह Parsec है (मैंने इसका उपयोग असेंबलर लिखने के लिए किया था), लेकिन मुझे इसका उपयोग करना बहुत पसंद था। मैंने केवल हैमेट्रिक्स और हास्केल ओपनजीएल बाइंडिंग का जीएचसीआई अन्वेषण किया है, लेकिन वे काफी अच्छे लगते हैं। हैमेट्रिक्स लगभग MATLAB (जो मैंने काफी इस्तेमाल किया है) के रूप में संक्षिप्त लगता है - जो विशेष रूप से उस तरह की चीज के लिए बनाया गया था। अपने सीमित अनुभव से पुस्तकालयों संगत कर रहे हैं - इस वजह से हास्केल सरल बिल्डिंग ब्लॉक्स की एक छोटी संख्या पर बनाया गया है - और क्योंकि Haskellers नहीं है जैसे सांसारिक काम करने के लिए वे भी समृद्ध कर रहे हैं :)
पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.