2012-05-11 31 views
7

मैं अब गहराई में स्कैला पढ़ रहा हूं। यहां पुस्तक से एक अंश दिया गया है:पथ-निर्भर प्रकार प्रकार अनुमान हैं?

सभी पथ-निर्भर प्रकार प्रकार अनुमान हैं। एक रास्ता निर्भर प्रकार foo.Bar foo.type#Bar संकलक द्वारा के रूप में ...

स्काला में फिर से लिखा है, सभी प्रकार के संदर्भ नामित संस्थाओं के खिलाफ परियोजनाओं के रूप में लिखा जा सकता है। टाइप scala.String scala.type#String के लिए शॉर्टेंड है जहां scala नाम scala पैकेज को संदर्भित करता है और String टाइप String वर्ग स्केल पैकेज पर परिभाषित किया गया है।

जाहिर है, वहाँ scala.String वर्ग नहीं है, लेकिन मैं Null के साथ इस पुन: पेश करने में विफल रहा है।

scala> type N = scala.type#Null 
<console>:7: error: type mismatch; 
found : type 
required: AnyRef 
     type N = scala.type#Null 

तो, मेरे प्रश्न इस प्रकार हैं। क्या पथ-निर्भर प्रकार अनुमान अनुमान हैं? क्या यह सिर्फ आंतरिक कंपाइलर प्रतिनिधित्व है या स्कैला कोड में व्यक्त किया जा सकता है?

उत्तर

8

यहां एक त्वरित आरईपीएल सत्र जो इस बात की पुष्टि क्या जोश ने लिखा है,

scala> class Foo { type T = String } 
defined class Foo 

scala> val foo = new Foo 
foo: Foo = [email protected] 

scala> implicitly[foo.type#T =:= foo.T] 
res0: =:=[foo.T,foo.T] = <function1> 

समस्या अपने scala.type#Null उदाहरण के साथ कि उपसर्ग scala एक पैकेज उपसर्ग एक मूल्य के एक स्थिर पहचानकर्ता के बजाय है। तर्कसंगत रूप से यह उत्तरार्द्ध होना चाहिए, लेकिन दुर्भाग्यवश यह नहीं है ... यह स्कैला पैकेज और स्कैला ऑब्जेक्ट्स (मॉड्यूल के अर्थ में) के अर्थशास्त्र के बीच एक विचित्र विसंगति है।

+0

लेकिन एसएलएस §3.1 के अनुसार एक पथ निम्न में से एक है ... p.x जहां पी पथ है और एक्स पी का एक स्थिर सदस्य है। स्थिर सदस्य पैकेज या ... एक स्थिर पहचान एक पथ है जो एक पहचान में समाप्त होता है। 'Scala.Null' स्थिर पहचानकर्ता है। सही? – 4e6

+0

नहीं, सभी स्थिर पहचानकर्ता मूल्य या पैकेज हैं: 'scala.Null' एक प्रकार को मान नहीं देता है। 'स्कैला' एक स्थिर पहचानकर्ता है, लेकिन जैसा कि आपने देखा है, किसी ऑब्जेक्ट के बजाए पैकेज होने के नाते, इसका व्यवहार ऑपरेटर '.type' में बना सिंगलटन प्रकार को लिखता है जो कि मेरे उत्तर में दिए गए उदाहरण' foo' से अलग है। –

+0

ओह, अब, आखिर में, मैं इसे '.type' व्यवहार के बारे में सब कुछ देखता हूं। इसे समझने में इतना समय लगा। बहुत बहुत धन्यवाद :) – 4e6