फ़ंक्शनल प्रोग्रामिंग के लिए मानसिक मॉडल या वास्तविक-विश्व-रूपक


16

क्या किसी के पास कार्यात्मक प्रोग्रामिंग के लिए एक अच्छा मानसिक मॉडल या रूपक है जो वास्तविक दुनिया में कुछ का संदर्भ देता है?

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग सहज रूप से मेरे लिए समझ में आता है। ऐसी चीजें हैं जिनमें गुण हैं और कभी-कभी वे अपने गुणों (विधियों) पर सामान भी कर सकते हैं या गणना कर सकते हैं। (पूर्व: कार, आकृति, बिल्ली)।

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

एक कार्यात्मक प्रतिमान में प्रोग्रामिंग के लिए कुछ अच्छे मानसिक मॉडल या वास्तविक दुनिया के रूपक क्या हैं? फ़ंक्शंस प्रोसेसिंग फ़ंक्शंस से बने कार्यों के बारे में कुछ है जो एक फर्म को खड़े होने और कोगेट करने के बिना छोड़ देता है।


"कार्यात्मक प्रोग्रामिंग" के कौन से ठोस अर्थ आप "कोई साइड-इफेक्ट्स / घोषणात्मक" या "प्रथम श्रेणी के कार्य / रचना" के बारे में बता रहे हैं? अथवा दोनों?
तीव्र

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

13
"वास्तविक दुनिया" मॉडल को अक्सर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए एक प्रेरणा के रूप में दिया जाता है। मुझे लगता है कि यह एक दृष्टिकोण है जिसे आपको अंततः आगे बढ़ना चाहिए, क्योंकि ओओपी में वस्तुओं को हमेशा वास्तविक दुनिया की वस्तुओं के अनुरूप नहीं होना चाहिए, और जब वे करते हैं, तो भी पत्राचार अक्सर अधूरा होता है; उदाहरण के लिए, "is-a" रिश्ते हमेशा समान नहीं होते हैं। दूसरी ओर, एक बार जब आप कहते हैं कि आप "वास्तविक दुनिया" में किसी चीज़ पर आधारित प्रोग्रामिंग भाषा के लिए एक मॉडल या रूपक चाहते हैं, तो मुझे लगता है कि आपने अनिवार्य रूप से खुद को ओओपी के इस सीमित रूप तक सीमित कर लिया है।
डेविड के

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

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

जवाबों:


32

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

smallest  = head . sort

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

smallestEven = head . sort . filter even

यह कन्वेयर बेल्ट पर सिर्फ एक और कदम है।

संक्षेप में, फ़ंक्शन केवल कच्चे इनपुट (भागों) को संसाधित अच्छे (आउटपुट) में बदलने के लिए उठाए गए चरणों का वर्णन करता है।


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

3
@GuidoAnselmi इसके बारे में सोचने का एक तरीका यह है कि कार्यात्मक प्रोग्रामिंग में असेंबली लाइन इनपुट को छोड़ते समय नए आउटपुट का निर्माण करती है, जबकि पारंपरिक OOP में असेंबली लाइन इनपुट को रूपांतरित करती है।
डोभाल

2
यह रूपक केवल "फ़ंक्शन प्रोग्रामिंग" का अर्थ "प्रथम श्रेणी के कार्यों / फ़ंक्शन संरचना" में समझ में आता है, न कि "कोई साइड-इफेक्ट्स / घोषणात्मक" में। इसके अलावा, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के साइड-इफेक्ट्स जरूरी नहीं हैं, इसलिए आप या तो ओओपी या एफपी के इस अर्थ के साथ एक विनाशकारी या रचनात्मक विधानसभा लाइन को लागू कर सकते हैं। OOP साइड इफेक्ट्स के बारे में एनकैप्सुलेशन, मैसेज पासिंग और पॉलीमॉर्फिज़्म के बारे में अधिक है, यह इस बात पर निर्भर करता है कि आप चीजों को कैसे मॉडल करते हैं। उदाहरण के लिए क्या आपको शुरू से अंत तक रेफरेंसियल पहचान की आवश्यकता है?
1

3
@bstamour: सटीक होने के लिए, किसी को उस (f . g) (x)साधन f(g(x))या f . gसाधन को लिखना चाहिए \x -> f (g (x))
जियोर्जियो

3
@MarjanVenema चीजें केवल उस उदाहरण में शेष हैं क्योंकि .यह परिभाषित किया गया है कि कैसे ; यह नहीं है कि हास्केल सामान्य रूप से कैसे काम करता है । आप बस |>हास्केल में एफ # के फॉरवर्ड पाइप ऑपरेटर ( ) को परिभाषित कर सकते हैं और लिख सकते हैं smallest x = (sort x) |> headऔर डेटा सही प्रवाह होगा। बस मैंने सोचा कि मैं बात करूंगा।
डोभाल

18

क्या किसी के पास कार्यात्मक प्रोग्रामिंग के लिए एक अच्छा मानसिक मॉडल है?

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


1
धन्यवाद। हालाँकि, मुझे वास्तविक दुनिया (जैसे कंप्यूटर या गणित से नहीं) से एक रूपक की आवश्यकता है।
गुइडो अंसलमी

3
@GuidoAnselmi: एक फ़ंक्शन एक ब्लैक बॉक्स है। आप एक तरफ कुछ डालते हैं और फिर दूसरी तरफ से कुछ नया निकलता है। यदि आप एक ही सामान अंदर रखते हैं, तो आप हमेशा एक ही सामान बाहर निकालते हैं। आप इनमें से बहुत सारे छोटे बक्से ले सकते हैं और उन्हें अलग-अलग ऑर्डर में जोड़कर एक कारखाना बना सकते हैं जो कच्ची धातुओं में लग सकता है और एक कार का उत्पादन कर सकता है। अंदर की प्रक्रिया बहुत सारे टुकड़ों में टूट जाती है, लेकिन बाहर से यह सिर्फ एक और कार्य है।
डेनिथ

16

के बारे में क्या फ्लिप पुस्तक के ?

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

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

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


3

रिश्तों।

मित्र: दो लोगों को देखते हुए, एक मित्र संबंध इन सामान्य कानूनों का पालन करता है

  1. एक-दूसरे के प्रति अच्छा व्यवहार रखें
  2. सोचता है कि दोनों एक-दूसरे के मित्र हैं (इसलिए इस संबंध में दोनों सदस्यों द्वारा कानूनों को पूरा किया जाना चाहिए)
  3. एक-दूसरे के साथ समय बिताने में मजा आता है

मोनॉयड: कई वस्तुओं और एक फ़ंक्शन को देखते हुए जो 2 आइटम लेता है और 1 रिटर्न देता है, एक मोनोइडल संबंध इन सामान्य कानूनों का पालन करता है

  1. उन मदों में से एक है (केवल एक, जिसे पहचान कहा जाता है) जो किसी भी अन्य आइटम के साथ फ़ंक्शन में जाता है यह सुनिश्चित करेगा कि फ़ंक्शन हमेशा अन्य आइटम (0 + 1 = 1) लौटाता है , इस प्रकार 0 की पहचान तब होती है जब आइटम नंबर और होते हैं फ़ंक्शन अतिरिक्त है)
  2. फ़ंक्शन उस आइटम पर काम नहीं कर सकता है या सेट नहीं कर सकता है जिसमें उसका एक समान संबंध है
  3. फ़ंक्शन साहचर्य है और इसे कुछ हद तक स्वतंत्र तरीके से वस्तुओं के साथ इस्तेमाल किया जा सकता है, इसका मतलब है एक * (b * c) = (a * b) * c जो कहता है कि आप b * c या c के परिणाम से गुणा कर सकते हैं * b के परिणाम से और परिणाम वही होगा जो आप पहले करते हैं।

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

चीजों के बीच संबंधों को नियंत्रित करने वाले कानूनों को मान्यता देते हुए, आप सामान्य कार्यान्वयन बना सकते हैं जो किसी भी तरह की चीजों के प्रारूप पर काम करते हैं, जिसमें उस प्रकार का संबंध होता है। कार्यात्मक प्रोग्रामिंग में आप चीजों के बीच संबंधों की पहचान करने की कोशिश करते हैं ताकि उन्हें आमतौर पर वर्गीकृत और इलाज किया जा सके।

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


2

सब कुछ का एक मूल्य है, और आप नए मूल्यों का उत्पादन करने के लिए मानों (जो कार्य हो सकते हैं) पर कार्य करते हैं, अधिमानतः बिना किसी दुष्प्रभाव के उत्पादन के लिए।


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

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

लेकिन गणित वास्तविक दुनिया पर आधारित है। 1 सूर्य, 9 ग्रह। 2 सेब प्लस 2 सेब चार सेब बनाता है।
गुइडो अंसलमी

और कार्यात्मक प्रोग्रामिंग में आपके पास सूरज, ग्रह और सेब के लिए एक प्रकार भी हो सकता है, फिर प्रकार सूर्य का एक मान, प्रकार ग्रह के 9 मान, और सेब प्रकार के लिए अतिरिक्त परिभाषित करें।
डोभाल

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

1

कार्यात्मक प्रोग्रामिंग के बारे में महसूस करने के लिए महत्वपूर्ण बात यह है कि सब कुछ एक मूल्य है - यहां तक ​​कि कोड स्वयं 'मूल्य' है।

एक साधारण कार्यात्मक प्रोग्रामिंग वातावरण का सबसे अच्छा उदाहरण हर किसी का पसंदीदा व्यवसाय उपकरण है - स्प्रेडशीट। स्प्रेडशीट में प्रत्येक सेल या तो डेटा है, या फ़ंक्शन का परिणाम है। और अधिक, यह फ़ंक्शन बंद नहीं हो सकता है और किसी अन्य सेल को संशोधित कर सकता है।

जब कोई एक कार्यशील भाषाओं की ओर बढ़ता है, तो कार्टेशियन ग्रिड के बजाय A1और B42, फ़ंक्शन के नाम होते हैं। यह सब वास्तव में है।

ऐसे अन्य पहलू हैं, जो इससे आगे बढ़ सकते हैं ... लेकिन इसके मूल में कार्यात्मक प्रोग्रामिंग है। एक सूची की संरचना या चीजों के समूह के बारे में चिंता करने की ज़रूरत नहीं है। फ़ंक्शनल प्रोग्रामिंग एक फ़ंक्शन में मान को पारित करने और स्मृति में कहीं भी किसी भी mucking के बिना एक मूल्य वापस पाने के बारे में है।

बस। फ़ंक्शनल प्रोग्रामिंग ग्रिड के बजाय नामों के साथ एक स्प्रेडशीट है।


0

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

OOP में, एक कोड ऑब्जेक्ट का उद्देश्य समस्या डोमेन में ऑब्जेक्ट की स्थिति होना है; उस डोमेन ऑब्जेक्ट में परिवर्तनों को प्रतिबिंबित करने के लिए यह समय के साथ बदलता है। एफपी में, एक मूल्य का प्रतिनिधित्व करता है एक डोमेन ऑब्जेक्ट की स्थिति का करता है; यह कभी नहीं बदलता है, आप बस अलग-अलग राज्यों का प्रतिनिधित्व करने के लिए अलग-अलग मूल्य बनाते हैं।

मैं कार्यात्मक मॉडल को थोड़ा अधिक ईमानदार पाता हूं कि कंप्यूटर वास्तव में क्या कर रहे हैं - प्रतिनिधित्व करते हैं। सब के बाद, मैं सिर्फ एक new Tesla()पतली हवा से बाहर नहीं कर सकता । :)


-5

वाक्य ऑब्जेक्ट-ओरिएंटेड की तुलना में अधिक कार्यात्मक हैं, यह मानते हुए कि आप उन्हें निम्न की तरह अधिक या कम तोड़ते हैं ...

The brown cow is in the meadow across the deep river.

इसलिए हमें प्रमुख वाक्यांशों और फिर बाकी चीजों को खोजने की जरूरत है:

The cow (brown)
the meadow (across)
the river (deep)

एक बार में:

sentence: The cow ((the meadow (the river (deep)) (across)) brown)

पार्स ट्री:

|                     sentence
|                      /         
|                  The cow
|                 /       \
|            the meadow   brown
|            /         \
|      the river      across
|              \
|              deep

पारसीमोनी कार्यात्मक सोच को संक्रमित करता है;

गोटलीब फ्रीज 1890s, एलन ट्यूरिंग (entschiedungsprobleme) 1930 के दशक, नोआम चॉम्स्की (1960) को सलाम।


4
यह एक भ्रामक व्याख्या है, और मैं शुरू करने के लिए FP से परिचित हूं।
डेनिथ

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