कार्यात्मक भाषा वाक्य रचना मानव भाषा के अधिक निकट क्यों नहीं है?


14

मैं कार्यात्मक प्रोग्रामिंग में रुचि रखता हूं और हास्केल के साथ सिर से सिर मिलाने का फैसला किया है। मेरा सिर दर्द करता है ... लेकिन मैं अंततः इसे प्राप्त करूंगा ... मुझे एक जिज्ञासा है, हालांकि वाक्य रचना इतनी गूढ़ है (दूसरे शब्द की कमी)?

क्या कोई कारण है कि यह अधिक अभिव्यंजक नहीं है , मानव भाषा के अधिक करीब है?

मैं समझता हूं कि एफपी गणितीय अवधारणाओं को समझने में अच्छा है और इसने उधार लिया है कि यह अभिव्यक्ति का संक्षिप्त साधन है, लेकिन फिर भी यह गणित नहीं है ... यह एक भाषा है।


4
@ratchet फ्रीक: :) तो क्या कोई ऐसे व्यक्ति द्वारा डिज़ाइन किया गया है जो पॉलिश नोटेशन से नफरत करता है?
जॉनडूडो

10
@ratchetfreak किस तरीके से हास्केल सिंटैक्स पॉलिश नोटेशन जैसा दिखता है? हास्केल ऑपरेटर इन्फिक्स होते हैं, जैसे अधिकांश अन्य भाषाओं के ऑपरेटर (और फ़ंक्शन कॉल उपसर्ग हैं - अधिकांश अन्य भाषाओं के फ़ंक्शन कॉल की तरह)।
sepp2k

10
यह एक बहुत बड़ी धारणा / छलांग है जो आप बना रहे हैं, कि "मानव भाषा के करीब" "अधिक अभिव्यंजक" के बराबर है।
मैट बॉल 15

7
कभी कोबोल और फोरट्रान के बारे में सुना है?
ott-- 15

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

जवाबों:


14

हास्केल और इसके पूर्ववर्ती मिरांडा जैसी कार्यात्मक भाषाएं लैम्ब्डा कैलकुलस की गणितीय अवधारणा से बढ़ीं । विकिपीडिया पृष्ठ से:

लैम्ब्डा कैलकुलस (जिसे λ-पथरी के रूप में भी लिखा जाता है या "लैम्ब्डा कैलकुलस" कहा जाता है) वैरिएबल लॉजिक में एक औपचारिक प्रणाली है, जो वैरिएबल बाइंडिंग और प्रतिस्थापन के माध्यम से गणना व्यक्त करने के लिए गणितीय तर्क है।

...

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

इस इतिहास की वजह से, इन कार्यात्मक भाषाओं (और अधिक अनिवार्य भाषाओं के कार्यात्मक तत्व) के वाक्यविन्यास लैम्बडा कैलकुलस द्वारा उपयोग किए जाने वाले गणितीय अंकन से दृढ़ता से प्रभावित होते हैं।

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


30

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

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

दूसरी ओर, आप किसी भी गणितज्ञ या तर्कशास्त्री को इस तरह का कोड दिखा सकते हैं:

x = x + 1

और वह पूरी तरह से भ्रमित हो जाएगा, कह रहा है: "इसका कोई मतलब नहीं है, ऐसा कोई भी नहीं है xजो प्लस के xबराबर है ।"x1

कुछ विशिष्ट संकेतन "क्रिप्टिक" है या नहीं, यह राय और परिचित का मामला है।


8
इस उत्तर के साथ सिर्फ एक समस्या है: मैं गणितज्ञ नहीं हूं।
जॉनडूडो

6
@ sepp2k: मैं असहमत था। अधिकांश लोगों के लिए प्रोग्रामिंग भाषाओं और कुछ बुनियादी गणितीय पृष्ठभूमि के पूर्व संपर्क w / o के लिए हैस्केल सिंटैक्स अपने सभी दुष्प्रभावों के साथ विशिष्ट प्रक्रियात्मक कोड की तुलना में समझने में बहुत सरल होगा और जटिल वातावरण विवरण निष्पादित होते हैं। सिंटैक्स जैसे whereकि जिस्ट की अनुमति देने के लिए अनुमति देते हैं । एक पंक्ति में एक समारोह।
बेंजामिन बैनियर

17
-1: यह उत्तर काफी हद तक पांडित्यपूर्ण लगता है। मैं काफी हद तक ओपी का मतलब बोली जाने वाली भाषा हूं।
स्टीवन एवर्स

6
वास्तव में, मुझे पूरा यकीन है कि x = infinityयह वास्तव में समीकरण को हल करता है।
डेडएमजी ऑक्ट

6
वैसे, प्रोग्रामिंग लैंग्वेज भी इंसानों द्वारा डिजाइन की जाती हैं। इस प्रकार आपकी परिभाषा के अनुसार, वे इंसानी भाषाएं हैं।
मार्को-फिसेट

13

मुझे लगता है कि एक चीज जो आप शायद चला रहे हैं, वह ऐसी चीज है जिसे मैं कार्यात्मक प्रोग्रामिंग सीखने के दौरान भी चलाता था, जो यह है कि कार्यात्मक प्रोग्रामिंग के साथ आप (और लगभग) उच्चतर स्तर पर सोचते हैं / काम करते हैं, जब आप अनिवार्य प्रोग्रामिंग के साथ काम करते हैं।

जो आप कम अभिव्यंजक के रूप में पा रहे हैं, मुझे लगता है कि वास्तव में अधिक अभिव्यंजक है: आपको हर छोटे से विस्तार को समझने की ज़रूरत नहीं है और कार्यात्मक प्रोग्रामिंग में कम कोड के साथ अधिक कर सकते हैं - आप जो लिखते हैं उसके लिए अधिक शक्ति है।

उदाहरण के लिए, मैं अनिवार्य रूप से लिख सकता था:

for each (Person person in people)
    print(person.name)

जो पूरी तरह से अंग्रेजी की तरह सुपाठ्य है।

एक हास्केल संस्करण हो सकता है (और यह मान्य हास्केल नहीं है, लेकिन सिंटैक्टिक तुलना के लिए है):

map (print . name) people

जिसके लिए कम कोड और कम विस्तार की आवश्यकता होती है - मुझे चीजों को एक लूप और उसके वेरिएबल (एस) में तोड़ने की जरूरत नहीं है for each (...), mapफ़ंक्शन मेरे लिए इसका ख्याल रखता है।

उस स्तर पर काम करने में कुछ आदत लग सकती है। यदि यह कोई मदद करता है, तो हास्केल शायद सबसे कठिन समय था जब मैंने एक नई भाषा सीखी थी जब से मैंने प्रोग्रामिंग शुरू की थी, और मैं जानता हूं> 10 भाषाएं (लिस्प सहित)। हालांकि यह पूरी तरह से सीखने लायक था।


8

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

मुझे लगता है कि यहां खेलने के लिए कई बल हैं:

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

  • किसी भी भाषा के ग्रेटर अर्थ (यानी अंग्रेजी की निकटता के बजाय बयानों की शक्ति), (IMO) सीखने की अवस्था की स्थिरता में एक ही कीमत है। स्कैलास में टेरसिटी एक अत्यधिक बेशकीमती गुण है, जिसमें कई चीजें वैकल्पिक हैं।

  • कार्यात्मक भाषाएं केवल चीजों को बहुत अलग तरीके से करती हैं, इसलिए मूल संचालन अनिवार्य निर्माणों पर मैप नहीं करते हैं।


3
मैं यह भी जोड़ना चाहूंगा कि अक्सर कार्यात्मक भाषाएं उच्चतर आदेश अवधारणाओं को व्यक्त कर सकती हैं, ये अधिक सारगर्भित होते हैं, सार्थक रूप से नाम के लिए कठिन होते हैं
jk।

1
@jk, हाँ, सहमत! इसी समय, यह इसलिए है कि उनके पास अनिवार्य पृष्ठभूमि और छोटे गणित (जैसे मेरे) के साथ प्रोग्रामर के लिए एक सीखने की अवस्था है, और वे क्यों सार्थक हैं।
रिचर्ड क्लोज

3

अगर मुझे आपकी पिछली टिप्पणी सही ढंग से समझ में आई है, तो आपका सवाल यह है कि हास्केल अक्सर प्रतीकात्मक ऑपरेटरों का उपयोग उन जगहों पर क्यों करता है जहाँ वह अल्फ़ान्यूमेरिक कीवर्ड (या फ़ंक्शन नाम) का उपयोग कर सकता है?

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

सामान्य रूप से प्रतीकात्मक संचालकों का एक अन्य कारण है। यह वास्तव में सूची बोध के आपके विशिष्ट उदाहरणों में लागू नहीं होता है ( <-इससे छोटा नहीं है in), लेकिन कई मामलों में ऐसा होता है।

फिर भी एक और कारण पठनीयता है। यह प्रति-सहज प्रतीत हो सकता है क्योंकि प्रतीकात्मक संचालक अक्सर कठिन होते हैं क्योंकि उनके "नाम" वास्तव में आपको कुछ भी नहीं बताते हैं कि वे क्या करते हैं (जबकि एक फ़ंक्शन का नाम आमतौर पर होगा), लेकिन एक बार जब आप जानते हैं कि कोई दिया गया ऑपरेटर क्या करता है, इनफ़िक्स प्रतीकात्मक ऑपरेटरों के साथ अभिव्यक्तियाँ अक्सर मानव के लिए एक से अधिक आसान होती हैं, जिनमें बहुत सारे अल्फा-न्यूमेरिक प्रीफ़िक्स फ़ंक्शन कॉल होते हैं, क्योंकि ऑपरेटर अधिक आसानी से उस तरह के ऑपरेंड से अलग दिखाई देते हैं। उदाहरण के लिए ज्यादातर लोग इस बात से सहमत होंगे कि 2 * 3 + 4अधिक आसानी से पढ़ने योग्य है add (mult 2 3) 4या add(mult(2, 3), 4)


@PeterTaylor नहीं, बस मुझे बेवकूफ बनाया जा रहा है ;-) अब ठीक है।
sepp2k

3

हास्केल कहते हैं, इम्पेरेटिव कंप्यूटर लैंग्वेज ज्यादातर नेचुरल लैंग्वेजेज के ज्यादा करीब नहीं होती हैं।

हालांकि, कुछ उदाहरण के लिए अंग्रेजी के अधिक बारीकी से डिज़ाइन किए गए हैं: कोबोल और हाइपरकार्ड। इन उदाहरणों से मैं जो सबक लूंगा, वे हैं:

  • प्राकृतिक भाषाओं की समानता प्रयोज्य में प्रत्यक्ष सुधार नहीं देती है
  • प्राकृतिक भाषाओं का अनुकरण सीधे उन कंप्यूटर भाषाओं को प्राप्त कर सकता है जो क्रिया और अस्पष्ट हैं

पर्ल कंप्यूटर भाषा को कथित तौर पर प्राकृतिक भाषा के कुछ और सूक्ष्म पहलुओं को ध्यान में रखकर बनाया गया था । मैं न्याय करूंगा कि पर्ल सामान्य प्रयोज्य पर कोबोल या हाइपरकार्ड से बेहतर करता है, लेकिन लोग पर्ल के बारे में अलग-अलग राय रखते हैं।


3

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

qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
               where lesser = [x | x <- xs, x <= p] 
                     greater = [x | x <- xs, x > p]

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

अधिक जटिल चीजें करना हस्केल में पढ़ना मुश्किल हो सकता है, लेकिन इसका प्रकार प्रणाली, विवश आईओ और वाक्य रचना के साथ बिल्कुल भी नहीं करना है।

अगर कुछ भी हो, तो मैं कहूंगा कि सिसक्स को समायोजित करने के लिए हास्केल ने वाक्य रचना को सरल बनाया है जो मानव भाषा के समान है। योजना जैसी भाषा में एक वाक्य-विन्यास होता है जो मनुष्य द्वारा लिखी जाने वाली बातों से बहुत दूर होता है, लेकिन इसके नियमों की व्याख्या करना वास्तव में सरल है।


3
मैं शायद ही उस मानव-पठनीय को बुलाऊंगा। मुझे पता है quicksort। मैं कई अलग-अलग भाषाओं में इसे स्थापित करने के तरीके से परिचित हूं, मुझे पता है कि यह क्या करना है, और मैं अभी भी उस कोड स्निपेट के नीचे के आधे हिस्से से सिर या पूंछ नहीं बना सकता हूं।
मेसन व्हीलर

मुझे लगता है कि यह वास्तव में आपकी पृष्ठभूमि पर निर्भर करता है। यह मेरे लिए उतना ही सादा है जितना कि ...
एंड्रिया

2
किसी भी स्थिति में, इस संकेतन से मिलता-जुलता माना जाता है: Purplemath.com/modules/setnotn.htm
एंड्रिया

4
क्या आप सुनिश्चित हैं कि यह नहीं होना चाहिए ++ [p] ++?
पीटर टेलर

1
@ मेसन: यह मुझे बहुत स्पष्ट लगता है, और मैंने हास्केल की एक पंक्ति कभी नहीं लिखी है
केविन क्लाइन

2

मुझे लगता है कि अंतर को कार्यात्मक / घोषणात्मक प्रोग्रामिंग के साथ एक समस्या के बारे में बयान करना पड़ता है जैसे कि यह एक गणित समस्या है, जहां अनिवार्य प्रोग्रामिंग एक प्रक्रिया का वर्णन करती है । व्यवसाय की दुनिया में, कंप्यूटर प्रोग्राम भौतिक प्रक्रियाओं को लपेटते हैं या प्रतिस्थापित करते हैं, इसलिए आपको ऐसी भाषा मिल सकती है जो इसे और अधिक सहज होने के लिए दर्शाती है।

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


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