(Dis-) संरचनात्मक टाइपिंग के लाभ


15

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

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

निश्चित रूप से जो संकलन नहीं करेंगे, क्योंकि बीच प्रकार संगतता Fooऔर Barनाम से निर्धारित होता है।

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

अब मुझे लगता है कि मैं एक संरचनात्मक प्रकार की प्रणाली के अधिकांश लाभों को समझता हूं, लेकिन मुझे आश्चर्य है कि अगर यह निम्न उदाहरणों से प्रकार की सुरक्षा को अमान्य नहीं करेगा

class Foo {
  class Bar { /* ... */ }
  def takeBar(b: Bar) = { /* ... */ }
  def getBar: Bar = new Bar
}

val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile

क्या मेरी समझ सही है कि एक संरचनात्मक प्रकार की प्रणाली में अंतिम पंक्ति के रूप में अच्छी तरह से संकलित किया जाएगा और यदि हां, तो क्या यह प्रकार की सुरक्षा के संबंध में नुकसान नहीं होगा?


3
क्या आप बता सकते हैं कि अंतिम पंक्ति क्यों संकलित नहीं होनी चाहिए? मुझे टाइप की असंगति नहीं दिखती।
सैम गोल्डबर्ग


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

जवाबों:


12

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

आप ऐसे मामलों को अस्वीकार कर देंगे जो स्कैला करता है: पथ-निर्भर प्रकार को एक अस्तित्वगत प्रकार के रूप में मॉडल करें। ऑब्जेक्ट एक्सेस के आस-पास एक ही पैक / अनपैक प्रक्रिया पकड़ में आती है, और परिणाम लगभग समान दिखाई देते हैं जो स्काला करता है। परिणाम एक मामूली प्रकार की समानता की तरह लग सकते हैं , लेकिन यह अभी भी एक संरचनात्मक प्रकार की प्रणाली होगी क्योंकि टाइप संगतता का प्रश्न अभी भी नाम के बजाय इंटरफ़ेस पर तय किया जाएगा।

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


0

संरचनात्मक टाइपिंग से जेनेरिक लाइब्रेरी कोड लिखना आसान हो जाता है। जावा पारिस्थितिकी तंत्र इतना फूला हुआ होने का # 1 कारण यह है कि छोटे पुस्तकालयों को आसानी से लिखना कठिन है। यदि जावा संरचनात्मक रूप से टाइप किया गया था, तो मुझे लगता है कि यह एक अलग कहानी और बहुत बेहतर स्थिति होगी।

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

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