2014-09-04 3 views
8

निम्नलिखित काम करता है:जूलिया: पैरामीट्रिक प्रकारों के बाहरी कन्स्ट्रक्टर क्यों होना चाहिए?

type TypeA 
     x :: Array 
     y :: Int 
     TypeA(x :: Array) = new(x, 2) 
     end 

julia> y = TypeA([1,2,3]) 
TypeA([1,2,3],2) 

यह नहीं करता है:

type TypeB{S} 
     x :: Array{S} 
     y :: Int 
     TypeB{S}(x:: Array{S}) = new(x,2) 
     end 

julia> y = TypeB([1,2,3]) 
ERROR: `TypeB{S}` has no method matching TypeB{S}(::Array{Int64,1}) 

काम करने के लिए दूसरे मामले पाने के लिए, एक प्रकार घोषणा के बाहर निर्माता घोषित करने के लिए है। यह थोड़ा अवांछनीय है। मेरा सवाल यह है कि यह समस्या जूलिया-डिजाइन दृष्टिकोण से क्यों मौजूद है, इसलिए मैं जूलिया टाइप-सिस्टम के बारे में बेहतर कारण बता सकता हूं।

धन्यवाद।

उत्तर

8

यह काम करता है:

type TypeB{S} 
    x::Array{S} 
    y::Int 
    TypeB(x::Array{S}) = new(x,2) 
end 
TypeB{Int}([1,2,3]) 

जो मैं reading the manual से पता लगा है, लेकिन मैं मानता चाहिए मैं वास्तव में आंतरिक कंस्ट्रक्टर्स समझ में नहीं आता है कि अच्छी तरह से, विशेष रूप से पैरामीट्रिक प्रकार के लिए। मुझे लगता है क्योंकि आप वास्तव में प्रकार के परिवार को परिभाषित कर रहे हैं, इसलिए आंतरिक कन्स्ट्रक्टर प्रत्येक व्यक्ति प्रकार के लिए केवल समझदार है - इसलिए आपको यह कहने के लिए {Int} निर्दिष्ट करने की आवश्यकता है। तुम्हें पता है, यह आसान बनाने के लिए एक बाहरी निर्माता जोड़ सकते हैं अर्थात

type TypeB{S} 
    x::Array{S} 
    y::Int 
    TypeB(x::Array{S}) = new(x,2) 
end 
TypeB{S}(x::Array{S}) = TypeB{S}(x) 
TypeB([1,2,3]) 

मुझे लगता है कि जूलिया मुद्दों पृष्ठ पर लाने के लिए, क्योंकि मैं इस बाहरी सहायक निर्माता डिफ़ॉल्ट रूप से प्रदान किया जा सकता की तरह महसूस अच्छा होगा।

संपादित करें: यह Julia issue डिफ़ॉल्ट रूप से बाहरी निर्माता प्रदान करने में समस्याएं बताता है।

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