参数类型创建

Dav*_*ley 7 julia

我正在努力理解朱莉娅中的参数类型创建.我知道我可以使用以下内容创建一个类型:

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"])
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何指定values将如何键入.做我喜欢的事似乎合情合理

type EconData{T}
   values::Array{T}
   ...
   function EconData(values::Array{T}, dates, colnames)
   ...
Run Code Online (Sandbox Code Playgroud)

但是,这(和类似的尝试)只是产生和错误:

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

我该如何指定类型values

Iai*_*ing 6

答案是,参数类型和内部构造函数的问题变得时髦 - 事实上,我认为它可能是Julia中最令人困惑的事情.直接的解决方案是提供合适的外部构造函数:

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"])
Run Code Online (Sandbox Code Playgroud)

什么也会有所作为

ed1 = EconData{Int}([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"])
Run Code Online (Sandbox Code Playgroud)

我的解释可能是错误的,但我认为可能是默认情况下没有参数类型构造函数方法,所以你必须为类型的特定实例化(我的第二个版本)调用构造函数或者自己添加外部构造函数(第一版).

其他一些评论:你应该明确维度.即如果您的所有字段都是向量(1D),请使用Vector{T}Array{T,1},如果它们是矩阵(2D),则使用Matrix{T}Array{T,2}.如果需要,可以在尺寸上使其参数化.如果不这样做,可能会生成慢代码,因为使用此类型的函数在运行时之前并不确定实际的数据结构,因此会进行大量检查.