12

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

तो मेरे सवालों का

  1. हैं क्या भूमिका एक कार्यात्मक भाषा में टाइप प्रणाली खेलने करता है?
  2. क्या किसी भाषा के लिए कार्यात्मक होने के लिए एक प्रकार की प्रणाली के लिए आवश्यक है?
  3. भाषा की प्रकार प्रणाली से संबंधित किसी भाषा का "कार्यात्मक" स्तर कैसा है?

उत्तर

39

एक भाषा की जरूरत नहीं है कार्यक्षम होने के लिखा जाता है - कम से कार्यात्मक प्रोग्रामिंग के दिल lambda calculus, जो untyped और typed वेरिएंट में आता है।

  • यह संकलन समय है कि त्रुटियों के एक वर्ग के रन-टाइम में नहीं हो सकता है पर एक गारंटी प्रदान करता है:

    प्रकार प्रणाली दो भूमिका निभाता है। त्रुटियों की श्रेणी में आमतौर पर दो स्ट्रिंग्स को एक साथ जोड़ने की कोशिश करने जैसी चीजें शामिल होती हैं, या फ़ंक्शन के रूप में पूर्णांक लागू करने का प्रयास करना शामिल होता है।

  • इसमें कुछ दक्षता लाभ हैं, उन वस्तुओं में रनटाइम पर अपने प्रकार को ले जाने की आवश्यकता नहीं है, क्योंकि संकलन समय पर पहले से ही स्थापित किए जा चुके हैं। इसे type erasure के रूप में जाना जाता है।

हास्केल के जैसे उन्नत प्रकार प्रणालियों में, प्रकार प्रणाली अधिक लाभ प्रदान कर सकते हैं: ओवरलोडिंग

  • : एक पहचानकर्ता का उपयोग करके विभिन्न प्रकार पर कार्रवाई का उल्लेख करने के
  • यह एक पुस्तकालय स्वचालित रूप से एक का चयन करने के लिए अनुमति देता है ऑप्टिमाइज़ किए गए कार्यान्वयन के आधार पर इसका उपयोग किस प्रकार किया जाता है (Type Families का उपयोग करके)
  • यह शक्तिशाली आविष्कारों को संकलित समय पर साबित करने की अनुमति देता है, जैसे कि लाल-काले पेड़ में इनवेरिएंट (Generalised Algebraic Datatypes का उपयोग करके)
+1

द्वारा आपका क्या मतलब है, ये उन्नत सुविधाएं मूल रूप से कार्यात्मक भाषाओं तक सीमित नहीं हैं। – sepp2k

+1

@ sepp2k true - क्या आप एक प्रकार की सिस्टम सुविधा के बारे में सोच सकते हैं जो * अंतर्निहित रूप से कार्यात्मक भाषाओं तक सीमित है? –

+0

नहीं। यही कारण है कि मैं यह नहीं कहूंगा कि "भाषा के कार्यात्मक स्तर" और प्रकार प्रणाली के बीच बहुत अधिक संबंध है। – sepp2k

2
  1. किसी भी प्रोग्रामिंग भाषा के रूप में एक ही है: यह आप से बचने/अपने कोड में त्रुटियों को खोजने के लिए मदद करता है। स्थैतिक टाइपिंग के मामले में एक अच्छी प्रकार की प्रणाली संकलन से कुछ प्रकार की त्रुटियों वाले कार्यक्रमों को रोकती है।
  2. नहीं untyped lambda calculus वह है जो आप कार्यात्मक प्रोग्रामिंग भाषाओं के प्रोटोटाइप को कॉल कर सकते हैं और जैसा कि नाम बताता है, पूरी तरह से untyped।
  3. एक कार्यात्मक भाषा में (साथ ही साथ कोई अन्य भाषा जहां एक फ़ंक्शन को मूल्य के रूप में उपयोग किया जा सकता है) प्रकार सिस्टम को यह जानने की आवश्यकता है कि फ़ंक्शन का प्रकार क्या है। इसके अलावा कार्यात्मक भाषाओं के लिए टाइप सिस्टम के बारे में कुछ खास नहीं है।

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

    आप (जैसे हास्केल में, आप एक आईओ प्रकार आवश्यकता होगी एक आईओ इकाई के लिए हालांकि हास्केल में की तरह एक इकाई typeclass एक आईओ इकाई के लिए आवश्यक नहीं हैं, तो आप एक प्रकार प्रणाली की जरूरत नहीं है, जो इसका समर्थन करता है)।

+0

क्या आपका मतलब है कि किसी भाषा के "कार्यात्मक" स्तर के बीच स्थिर या गतिशील रूप से टाइप किया गया है? –

+2

@ abhin4v: मुझे यकीन है कि "कार्यात्मक स्तर" – sepp2k

14

एक कार्यात्मक भाषा में टाइप सिस्टम किस भूमिका निभाता है?

साइमन मार्लो उत्तम जवाब देने के लिए

, मैं जोड़ना होगा एक प्रकार प्रणाली, विशेष रूप से एक है कि बीजीय डेटा प्रकार भी शामिल है, यह आसान कार्यक्रमों लिखने के लिए करता है कि:

  • सॉफ्टवेयर डिजाइन है, जो वस्तु में कभी-कभी यूएमएल आरेखों का उपयोग करके व्यक्त की जाने वाली भाषाओं को व्यक्त किया जाता है, जो कि प्रकारों का उपयोग करके स्पष्ट रूप से व्यक्त किए जाते हैं। यह स्पष्टता विशेष रूप से प्रकट होती है जब न केवल मान प्रकार हैं, लेकिन मॉड्यूल में उद्देश्य कैमल या मानक एमएल के प्रकार हैं।

    • समारोह प्रकार का मान हमेशा एक लैम्ब्डा के साथ बनाया जा सकता है:

    • जब कोई व्यक्ति कोड लिख रहा है, सरल heuristics की एक जोड़ी यह बहुत, बहुत आसान प्रकार के आधार पर शुद्ध कार्यों लिखने के लिए बनाने के ।

    • फ़ंक्शन प्रकार का एक मूल्य इसे लागू करके हमेशा खाया जा सकता है।
    • किसी भी प्रकार के रचनाकारों को लागू करके बीजगणित डेटा प्रकार का एक मूल्य बनाया जा सकता है।
    • बीजगणितीय डेटा प्रकार का एक मूल्य case अभिव्यक्ति के साथ जांच करके इसका उपभोग किया जा सकता है।

    इन टिप्पणियों के आधार पर, और सरल नियम है कि जब तक कोई कारण नहीं है, एक समारोह अपने तर्कों में से प्रत्येक का उपभोग करना चाहिए पर, यह संभव कोड की जगह आप एक बहुत छोटा करने के लिए लिख सकता है कटौती करने बहुत आसान है उम्मीदवारों की संख्या उदाहरण के लिए, बस प्रकार की है कि कई समझदार कार्य (हास्केल अंकन का उपयोग)

    forall a . (a -> Bool) -> [a] -> Bool 
    

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

1

1: वही किसी अन्य रूप में, यह आप आपरेशनों है कि या तो ख़राब ढंग से परिभाषित कर रहे हैं, या जिनके परिणाम मनुष्य के लिए 'अतर्कसंगत' होगा करने से रोकता है। पूर्णांक पर फ्लोट अतिरिक्त की तरह।
2: नहीं, दुनिया की सबसे पुरानी प्रोग्रामिंग भाषा, (untyped) लैम्ब्डा कैलकुस, कार्यात्मक और untyped दोनों है।
3: शायद ही, कार्यात्मक का मतलब है कि कोई दुष्प्रभाव नहीं, कोई उत्परिवर्तन, संदर्भित पारदर्शिता और cetera।

बस याद रखें कि सबसे पुरानी कार्यात्मक भाषा, अनियमित लैम्ब्डा कैलकुस में कोई प्रकार की प्रणाली नहीं है।

संबंधित मुद्दे