参数类型创建

时间:2015-05-28 23:00:38

标签: 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"])

但是,我无法弄清楚如何指定values的输入方式。我做一些像

这样的事似乎是合理的
type EconData{T}
   values::Array{T}
   ...
   function EconData(values::Array{T}, dates, colnames)
   ...

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

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

如何指定values的类型?

1 个答案:

答案 0 :(得分: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"])

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

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