लिस्प और स्कीम के प्रकार


10

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

जवाबों:


6

सीएल प्रकार प्रणाली हास्केल एक की तुलना में अधिक अभिव्यंजक है, उदाहरण के लिए, आपके पास (or (integer 1 10) (integer 20 30))मूल्य के लिए एक प्रकार हो सकता है 1,2,...9,10,20,21,...,30

हालांकि, लिस्प कंपाइलर आपके गले के नीचे की सुरक्षा के बारे में उनकी समझ को बाध्य नहीं करते हैं, इसलिए आप उनके "नोट्स" को अपने जोखिम पर अनदेखा कर सकते हैं ।

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

मूल रूप से, यदि आप मजबूत स्थैतिक टाइपिंग चाहते हैं, तो Haskell या OCaml का उपयोग करें, यदि आप मजबूत डायनामिक टाइपिंग चाहते हैं, तो Lisp का उपयोग करें। यदि आप कमजोर स्थिर टाइपिंग चाहते हैं, तो C का उपयोग करें, यदि आप कमजोर डायनामिक टाइपिंग चाहते हैं, तो पर्ल / पायथन का उपयोग करें। प्रत्येक पथ के अपने फायदे (और zealots) और नुकसान (और detractors) हैं, इसलिए आप उन सभी को सीखने से लाभान्वित होंगे।


19
"बल टाइप सेफ्टी योर थ्रोट" जैसे शब्दों का उपयोग करने वाला व्यक्ति यह नहीं समझ पाता है कि सुरक्षा किस प्रकार की है या यह क्यों उपयोगी है।
मेसन व्हीलर

11
@MasonWheeler: एकल वाक्यांश से व्यापक निष्कर्ष निकालने वाला कोई भी व्यक्ति स्वयं को अन्यथा की तुलना में अधिक बार गलत पाएगा। जैसे, इस मामले में।
एसडीएस

4
चूंकि विषय भाषा है, "आपके गले के नीचे" शब्द उपयुक्त और उपयुक्त कल्पना है।
लूसर ड्रॉग

1
@ केचलौक्स: मेरा मतलब था "अभिव्यंजक", जैसा कि उदाहरण द्वारा स्पष्ट किया गया है।
एसडीएस

4
आपको यह सब पीछे की ओर मिला है। डायनेमिक टाइपिंग स्टेटिक टाइपिंग का एक विशेष मामला है, जहां आप प्रोग्रामर को हर चीज के लिए 1 प्रकार का उपयोग करने के लिए मजबूर करते हैं। मैं प्रत्येक चर को टाइप के रूप में Objectया जो भी प्रकार पेड़ की जड़ है, सबसे अधिक वैधानिक रूप से टाइप की गई भाषाओं में एक ही काम कर सकता हूं । यह कम अभिव्यंजक है, क्योंकि आप यह कहने के विकल्प से वंचित हैं कि कुछ निश्चित चर में केवल कुछ मान हो सकते हैं।
डोभाल

5

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

(define (first some-list)
  (if (empty? some-list)
      #f
      (car some-list)))

गैर-रिक्त सूचियों के लिए, यह पहला तत्व देता है। खाली सूचियों के लिए, यह गलत है। अनकैप्ड भाषाओं में यह आम है; टाइप की गई भाषा कुछ आवरण प्रकार का उपयोग करती है जैसे Maybeकि खाली मामले में कोई त्रुटि। यदि हम इस फ़ंक्शन में एक प्रकार जोड़ना चाहते हैं, तो किस प्रकार का उपयोग किया जाना चाहिए? यह [a] -> a(हास्केल संकेतन में) नहीं है, क्योंकि यह गलत हो सकता है। यह भी नहीं है [a] -> Either a Boolean, क्योंकि (1) यह हमेशा खाली मामले में झूठ बोलता है, न कि एक मनमाना बूलियन और (2) एक या तो प्रकार में तत्वों को Leftऔर झूठे में लपेटता है Rightऔर आपको वास्तविक तत्व को प्राप्त करने के लिए "दोनों को अनफ्रैप" करने की आवश्यकता होती है। इसके बजाय, मान एक वास्तविक संघ देता है- कोई रैपिंग कंस्ट्रक्टर नहीं है, यह केवल कुछ मामलों में एक प्रकार और अन्य मामलों में एक अन्य प्रकार देता है। टाइप रैकेट में, यह यूनियन प्रकार के निर्माता के साथ दर्शाया गया है:

(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
  (if (empty? some-list)
      #f
      (car some-list)))

प्रकार (U A #f)बताता है कि फ़ंक्शन सूची के किसी भी तत्व को वापस कर सकता है या बिना किसी रैपिंग Eitherइंस्टेंस के गलत हो सकता है । प्रकार चेकर यह अनुमान लगा सकता है कि some-listया तो टाइप (Pair A (Listof A))या खाली सूची है, और इसके साथ ही यह भी है कि यदि कथन की दो शाखाओं में यह ज्ञात है कि इनमें से कौन सा मामला है । प्रकार चेकर जानता है कि (car some-list)अभिव्यक्ति में, सूची में प्रकार होना चाहिए(Pair A (Listof A)) क्योंकि यदि स्थिति यह सुनिश्चित करती है। इसे घटना टाइपिंग कहा जाता है और इसे अनपेड कोड से टाइप कोड में संक्रमण को कम करने के लिए डिज़ाइन किया गया है।

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

एक क्रमिक प्रकार की प्रणाली को सामान्य अप्रचलित मुहावरों से निपटने और मौजूदा अनकैप्ड कोड के साथ बातचीत करने के लिए उपकरण प्रदान करना चाहिए। इसका उपयोग करना काफी दर्दनाक होगा अन्यथा, देखें कि हम क्लोजर उदाहरण के लिए "क्यों हम अब Core.typed का उपयोग नहीं कर रहे हैं"


1
अर्थशास्त्र में, इसे ग्रेशम के नियम के रूप में जाना जाता है : खराब धन अच्छा होता है। यह इंजीनियरिंग में भी एप्लिकेशन ढूंढता है। जब आपके पास अपने सिस्टम के भीतर दो सैद्धांतिक रूप से बराबर सबसिस्टम होते हैं, तो सभी अक्सर खराब होते हैं जो बेहतर उपयोग करने लायक कई समस्याओं का कारण बनेंगे, जैसा कि हम यहां देख रहे हैं।
मेसन व्हीलर

"एक प्रकार प्रणाली है कि डिजाइन करने का एक उदाहरण": इस वाक्य पूरा नहीं हुआ है
coredump

@MasonWheeler सबसे बुरा है, मुझे लगता है, गतिशील प्रकार की जाँच करें। तो जैसे ही आप इसे पेश करते हैं, यह कुछ स्थैतिक विश्लेषण करने के लायक नहीं है?
coredump

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

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