2015-05-28 2 views
7

मैं जुलिआ में पैरामीट्रिक प्रकार के निर्माण को समझने के लिए संघर्ष कर रहा हूं। मुझे पता है कि मैं निम्नलिखित के साथ एक प्रकार बना सकते हैं:पैरामीट्रिक प्रकार निर्माण

type EconData 
    values 
    dates::Array{Date} 
    colnames::Array{ASCIIString} 

    function EconData(values, dates, colnames) 
    if size(values, 1) != size(dates, 1) 
     error("Date/data dimension mismatch.") 
    end 
    if size(values, 2) != size(colnames, 2) 
     error("Name/data dimension mismatch.") 
    end 
    new(values, dates, colnames) 
    end 
end 

ed1 = EconData([1;2;3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"]) 

हालांकि, मैं समझ नहीं values कैसे टाइप किया जा जाएगा निर्दिष्ट करने का तरीका।

ERROR: `EconData{T}` has no method matching EconData{T}(::Array{Int64,1}, ::Array{Date,1}, ::Array{ASCIIString,2}) 

मैं values का प्रकार निर्दिष्ट कैसे कर सकते हैं: यह

type EconData{T} 
    values::Array{T} 
    ... 
    function EconData(values::Array{T}, dates, colnames) 
    ... 

बहरहाल, यह (और इसी तरह के प्रयास) की तरह कुछ करने के लिए बस का उत्पादन और त्रुटि मेरे लिए उचित लगता है?

+0

यह प्रकार एक जैसा दिखता है जो मैंने लगभग खुद को समाप्त कर लिया है (और यह ओपन-सोर्स और एमआईटी लाइसेंस है)। तो शायद मैं आपको कुछ काम बचा सकता हूं। विशेष रूप से, क्या आपकी तिथियां हमेशा आरोही क्रम में क्रमबद्ध की जाएंगी? यदि ऐसा है, तो आप अपने प्रकार का उपयोग करने वाले सभी तरीकों से उस तरह का लाभ उठा सकते हैं। यह मेरे द्वारा निर्मित प्रकार का आधार है। दुर्भाग्य से मैं इसे अभी तक दस्तावेज करने के लिए नहीं मिला है, लेकिन स्रोत [github] पर है (https://github.com/colintbowers/SortedStructures.jl)। डेटा वेक्टर या मैट्रिक्स है या नहीं और क्या तारीख अद्वितीय हैं, इस पर निर्भर करते हुए चार विकल्प हैं। –

+1

यह भी ध्यान दें कि 'ऐरे {टी}' एक ठोस प्रकार नहीं है, क्योंकि 'ऐरे' भी एक आयाम पैरामीटर लेता है। Http://docs.julialang.org/en/release-0.3/manual/faq/#how-do-abstract-or-ambiguous-fields-in-types-interact-with-the-compiler यह महत्वपूर्ण क्यों है देखें। – tholy

उत्तर

6

उत्तर यह है कि things get funky with parametric types and inner constructors - वास्तव में, मुझे लगता है कि यह शायद जूलिया में सबसे भ्रमित चीज है। तत्काल समाधान के लिए एक उपयुक्त बाहरी निर्माता प्रदान करना है:

using Dates 

type EconData{T} 
    values::Vector{T} 
    dates::Array{Date} 
    colnames::Array{ASCIIString} 
    function EconData(values, dates, colnames) 
     if size(values, 1) != size(dates, 1) 
      error("Date/data dimension mismatch.") 
     end 
     if size(values, 2) != size(colnames, 2) 
      error("Name/data dimension mismatch.") 
     end 
     new(values, dates, colnames) 
    end 
end 
EconData{T}(v::Vector{T},d,n) = EconData{T}(v,d,n) 

ed1 = EconData([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"]) 

क्या भी काम किया है | किया है

ed1 = EconData{Int}([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"]) 

मेरे स्पष्टीकरण गलत हो सकता है करने के लिए है, लेकिन मुझे लगता है कि शायद है कि वहाँ कोई डिफ़ॉल्ट रूप से बनाए गए पैरामीट्रिक प्रकार कन्स्ट्रक्टर विधि, इसलिए आपको प्रकार (मेरे दूसरे संस्करण) के विशिष्ट तत्कालता के लिए निर्माता को कॉल करना होगा या बाहरी कन्स्ट्रक्टर स्वयं (पहला संस्करण) जोड़ना होगा।

कुछ अन्य टिप्पणियां: आपको आयामों के बारे में स्पष्ट होना चाहिए। यानी यदि आपके सभी फ़ील्ड वैक्टर (1 डी) हैं, तो Vector{T} या Array{T,1} का उपयोग करें, और यदि उनके matrices (2D) Matrix{T} या Array{T,2} का उपयोग करते हैं। यदि आपको आवश्यकता हो तो इसे आयाम पर पैरामीट्रिक बनाएं। यदि आप नहीं करते हैं, तो धीमी कोड उत्पन्न की जा सकती है क्योंकि इस प्रकार का उपयोग करने वाले फ़ंक्शंस रनटाइम तक वास्तविक डेटा संरचना के बारे में वास्तव में निश्चित नहीं हैं, इसलिए बहुत सारे चेक होंगे।

+0

मैं पहले संस्करण को दूसरा स्थान दूंगा, हालांकि व्यक्तिगत रूप से मैंने 'फ़ंक्शन ईकॉनडाटा {टी} ((मूल्य :: वेक्टर {टी}, तिथियां :: वेक्टर {दिनांक}, कॉलनाम :: ऐरे {ASCIIString}) किया होगा मेरे आंतरिक कन्स्ट्रक्टर, और उसके बाद एक बाहरी कन्स्ट्रक्टर है: 'कार्य EconData {T} ((मान :: वेक्टर {टी}, तिथियां :: वेक्टर {दिनांक}, उपनाम :: ऐरे {ASCIIString}) = EconData {eltype (मान)} (मूल्य, तिथियां, उपनाम) '। यह हर बार जब आप उनमें से एक बनाते हैं तो 'मानों' के प्रकार को लिखने के लिए सहेजता है। –

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