क्या कोई मुझे बता सकता है कि डेटा/प्रकार कन्स्ट्रक्टर और कार्यों के बीच अंतर क्या हैं? हास्केल उन्हें मिलाएं और हमें एक सार्वभौमिक इंटरफ़ेस दें (सभी कार्यों की तरह दिखते हैं, विशेष रूप से, हम आंशिक रूप से उन्हें लागू कर सकते हैं), जबकि एमएल परिवार भाषाएं उन्हें अलग करती हैं।डेटा/प्रकार कन्स्ट्रक्टर और कार्यों के बीच मतभेद?
उत्तर
आपकी डिचोटोमी "हास्केल बनाम एमएल दुनिया" गलत है। एसएमएल कन्स्ट्रक्टर को कार्यों के लिए भी बढ़ावा देता है, और कैमल लाइट का इस्तेमाल होता था। मुझे यकीन नहीं है कि इसे ओकैमल में क्यों हटा दिया गया था, मुझे लगता है कि डिजाइनर ने सोचा था कि इसकी वास्तविक आवश्यकता नहीं थी।
गहन कारण हैं कि कन्स्ट्रक्टर थोड़ा खास क्यों हैं। उनका उपयोग पैटर्न में किया जा सकता है, जबकि सामान्य कार्य नहीं कर सकते - मुझे लगता है कि इसे ध्रुवीकृत तर्क और फोकस करने की अवधि में समझाया जा सकता है। साथ ही, मूल्यों पर लागू एक कन्स्ट्रक्टर को मान माना जा सकता है, जबकि यह सामान्य कार्यों के लिए सच नहीं है। कॉल-दर-मूल्य भाषाओं में एक उप-वर्ग में रिकर्सिव मान परिभाषा को प्रतिबंधित करने के लिए यह आम है जो कन्स्ट्रक्टर एप्लिकेशन की अनुमति देता है, लेकिन सामान्य फ़ंक्शन एप्लिकेशन नहीं।
मैं मानता हूं कि कार्यों के लिए सभी रचनाकारों को बढ़ावा देने की "अर्थात् चीनी" अच्छी है। मुझे लगता है कि अगर यह स्केल के Some(_)
जैसे लघु अमूर्तता के लिए एक अच्छा वाक्य रचनात्मक चीनी था तो यह इतना उपयोगी नहीं होगा। क्या रचनाकारों को मेरी राय में करीबी होना चाहिए (आपका "आंशिक आवेदन" टिप्पणी) या नहीं, एक अलग और ऑर्थोगोनल सवाल है।
¹: गलत डिचोटोमी होने के अलावा, आपके प्रश्न के स्वर में "हास्केलर्स और एमएलर्स का एक निश्चित स्वाद है, यहां अंगूठी है, कृपया लड़ो!"। यह जानबूझकर नहीं हो सकता है, लेकिन वैसे भी आपको ऐसे फॉर्मूलेशन से बचना चाहिए। भाषा डिजाइन समझौता से बना है, और यह मानते हुए कि दो अलग-अलग भाषाओं ने अलग-अलग विकल्पों को चुना है, उनमें से एक सही है और दूसरा कोई अच्छा दृष्टिकोण नहीं है।
पीएस: प्रश्न तब से संपादित किया गया है और अब यह अधिक तटस्थ है। संपादन के लिए धन्यवाद।
²: के रूप में petebu द्वारा अनुरोध किया, यहाँ एक छोटे से अधिक (वास्तव में एक बहुत अधिक) "ध्यान केंद्रित कर और polarity" के बारे में जानकारी है। मैं यह इंगित करना चाहता हूं कि मैं वास्तव में इस विषय पर एक विशेषज्ञ नहीं हूं (इसलिए "मुझे लगता है")।
मैं 200 9 में नीलकांतन कृष्णास्वामी द्वारा पेपर Focusing on Pattern Matching (PDF) पेपर की सिफारिश करता हूं। इसमें लोगों के लिए ध्रुवीकृत तर्क और ध्यान केंद्रित करने में कुशल नहीं है (लेकिन आपको कम से कम अनुक्रमिक गणना के साथ परिचित होना चाहिए)। अनुक्रमिक कैलकुस में सामान्य रूप से, प्रकार/प्रस्तावों को "दाएं ओर" पेश किया जाता है और "बाईं ओर" समाप्त/deconstructed। लेकिन यहां हम "ध्रुवीयता" द्वारा उत्पाद को अलग करते हैं, उत्पाद और रकम सकारात्मक होते हैं और नकारात्मक कार्य करते हैं (मेरा अंतर्ज्ञान यह है कि उत्पाद/रकम डेटा होते हैं जबकि कार्यों की गणना होती है, लेकिन पृथक्करण अनुक्रमिक गणना में उनके व्यवहार के बहुत प्राकृतिक विचारों से प्रेरित होता है) और पेपर से पता चलता है कि तीर प्रकारों के बाएं-उन्मूलन कार्य अनुप्रयोग से मेल खाते हैं, जबकि योग/उत्पाद प्रकारों के बाएं-उन्मूलन पैटर्न मिलान से मेल खाते हैं। एक case
निर्माण है जो पैटर्न मिलान (कुछ मतभेदों के साथ) के समान व्यवहार करता है, जो सकारात्मक को समाप्त करता है, इसलिए कार्यों पर लागू नहीं किया जा सका।
अन्य महत्वपूर्ण संदर्भ Focusing on Binding and Computation होगा, डेन लाइकाटा, नोएम ज़िलबर्गर और रॉबर्ट हार्पर, 2008 द्वारा (ध्यान दें कि यदि आप इन विषयों पर एक पेपर जमा करने की योजना बना रहे हैं, तो "फोकस ऑन ..." थोड़ा सा हो रहा है क्लिच)।यह एमएल-स्टाइल पैटर्न मिलान के साथ बहुत कम लिंक पर जोर देता है, लेकिन यह बहुत अच्छा विचार प्रस्तुत करता है कि कम्प्यूटेशनल तीर "बाईं ओर नकारात्मक" हैं (शास्त्रीय समतुल्य A→B ≡ ¬A∨B
के रूप में आसानी से देखा जाता है), कोई एक अलग तीर पेश कर सकता है, "सकारात्मक बाएं ", इसलिए सकारात्मक ध्रुवीकरण, जो पैटर्न-मिलान किया जा सकता है। यह पता चला है कि यह तीर वेरिएबल बाइंडिंग का प्रतिनिधित्व करने के लिए एक अच्छा मैच है (यदि आप उच्च ऑर्डर सार सिंटेक्स से परिचित हैं, तो विचार यह है कि बाएं ध्रुवीयता "विदेशी शब्द" से बाहर निकलती है जो उनके चर पर गणना करने का प्रयास करती हैं), ताकि वेरिएबल्स बाइंडिंग वाले शब्द डेटा संरचना हैं जो रकम या उत्पादों की तरह पैटर्न-मिलान हो सकते हैं।
मैंने अपने पेपर को पढ़ने के लिए थोड़ा मुश्किल पाया, इसलिए मैं Dan Licata's slides से शुरू करूंगा। अंत में, रॉबर्ट हार्पर other slides कि आगमनात्मक निर्णय/derivations की Termes में एक अलग अंतर्ज्ञान प्रदान करता है बना दिया है: सकारात्मक तीर derivability (? आप परिकल्पना ए और बी के तहत सी की व्युत्पत्ति का निर्माण कर सकता है), जबकि नकारात्मक तीर स्वीकार्यता का प्रतिनिधित्व प्रतिनिधित्व करते हैं (ए और बी के व्युत्पन्न दिए गए, आप सी के व्युत्पन्न के निर्माण के लिए उन्हें फिर से लिखने/एक्सप्लोर करने के लिए कैसे उपयोग करेंगे?)। बहुत दिलचस्प सामान।
+1। "इसे ध्रुवीकृत तर्क और ध्यान केंद्रित करने की अवधि में समझाया जा सकता है"। क्या आप इसे विस्तार से बताएंगे? एक पेपर के लिए एक लिंक होगा। – phooji
+1 के लिए http://conal.net/blog/posts/everything-is-a- कार्यक्षमता-in-haskell/ – petebu
@petebu: मैंने दो संदर्भ प्रदान करने के लिए संपादित किया। – gasche
हास्केल कुछ ओकैमल वाक्यविन्यास को कम और सरल बनाता है। लेकिन हास्केल सिंटैक्स रचनात्मक और कार्यों को स्पष्ट रूप से अलग करता है। फ़ंक्शन एक लोअरकेस अक्षर से शुरू होते हैं और कन्स्ट्रक्टर्स ऊपरी केस अक्षर से शुरू होते हैं। इंफिक्स ऑपरेटरों के साथ डेटा कन्स्ट्रक्टर को एक कोलन से शुरू होना चाहिए और सामान्य ऑपरेटर कभी भी कोलन से शुरू नहीं हो सकते हैं।
रचनाकारों के लिए इंटरफ़ेस सरल (शायद आंशिक) फ़ंक्शन एप्लिकेशन की तरह दिख सकता है, यह एक तर्क रचनाकार बनाता है और अधिकांश न्यूटाइप का उपयोग करना बहुत आसान है (बस "हैलो")। लेकिन हास्केल आपको ओकैमल-जैसे रिकॉर्ड नामों और {फ़ील्ड = मान, फ़ील्ड = वैल्यू} शैली का उपयोग करने देता है, हालांकि हास्केल में आपको फील्ड नाम रखने के लिए मजबूर नहीं किया जाता है या इस वाक्यविन्यास का उपयोग करने के लिए मजबूर नहीं किया जाता है। तो ओकैमल में केवल एकल फ़ील्ड के लिए सरल वाक्यविन्यास है, लेकिन हास्केल आपको एक से अधिक फ़ील्ड के लिए सरल वाक्यविन्यास देता है। आखिरकार, फ़ील्ड नामों से परहेज करना बड़े प्रकार के लिए खराब है क्योंकि स्थितित्मक फ़ंक्शन-जैसे सिंटैक्स रिफैक्टर के लिए कठिन होता है।
पहले मूल्य और प्रकार के बीच का अंतर समझाया जाना चाहिए।
"क्योंकि हास्केल पूरी तरह कार्यात्मक भाषा है, इसलिए सभी गणना मूल्यों (अमूर्त संस्थाओं जिन्हें हम उत्तर के रूप में मानते हैं) उत्पन्न करने के लिए अभिव्यक्तियों (वाक्य रचनात्मक शर्तों) के मूल्यांकन के माध्यम से की जाती हैं। प्रत्येक मूल्य में एक संबद्ध प्रकार होता है।" - हास्केल 98 के लिए एक सौम्य परिचय (यह ट्यूटोरियल काफी सभ्य नहीं है)
हास्केल मान "प्रथम श्रेणी" हैं जबकि हास्केल प्रकार नहीं हैं। मूल्यों का वर्णन करने के लिए मूल्यों का मूल्य और मूल्य के संयोजन का उपयोग किया जाता है और इसके प्रकार को टाइपिंग कहा जाता है।
डेटा/प्रकार कन्स्ट्रक्टर के बीच का अंतर यह है कि: डेटा कन्स्ट्रक्टर लागू करने से मूल्य उत्पन्न होता है, लेकिन एक प्रकार का कन्स्ट्रक्टर लागू करने से एक प्रकार उत्पन्न होता है।
कार्य केवल मूल्यों का वर्णन करने वाले अभिव्यक्ति हैं, जो कि एक प्रकार से जुड़े हैं। जब आप किसी फ़ंक्शन का मूल्यांकन करते हैं तो आप मूल्यों का वर्णन करने वाले अभिव्यक्तियों का मूल्यांकन कर रहे हैं।
-1। मेरा मानना है कि ओपी बीजगणितीय डेटाटाइप रचनाकारों और कार्यों के बीच अंतर के बारे में पूछ रहा था, जिनमें से दोनों मूल्य पैदा करते हैं। – petebu
@petebu मुझे एक ही विश्वास था, लेकिन असल में ओपी * बहुत * संदिग्ध है, और उसका सवाल (जैसा कि मुझे इस जवाब को पढ़ने के बाद महसूस हुआ) पढ़ा जा सकता है "एमएलएस प्रकार के स्तर पर फ़ंक्शन-जैसी वाक्यविन्यास का उपयोग क्यों नहीं करते हास्केल की तरह? "। मुझे लगता है कि सबसे प्राकृतिक जवाब यह है कि एमएल मॉड्यूल भाषा के बाहर उच्च प्रकार के प्रकार का समर्थन नहीं करते हैं, इसलिए आंशिक अनुप्रयोगों को समझ में नहीं आता है। – gasche
हास्केल * * सब कुछ एक कार्य है "आदर्श वाक्य नहीं है! क्रमांकित फुटनोट – sclv