为什么我的类型构造函数不被识别

时间:2014-02-11 05:41:52

标签: types int julia int64

我对Julia完全不熟悉(刚刚今天早些时候开始),请原谅我,如果这是一个愚蠢的问题,但是尽管我喜欢这种语言,但我找不到很多很好的调试帮助。

基本上我只想为一个方法定义一个替代构造函数,该方法将在包含任何类型的整数(int32,uint8等等)的数组的输入上激活。

我认为这会相对简单并写下以下内容:

type MyType
    weight_matrices::Array{Array{FloatingPoint}}

    MyType(layer_sizes::Array{Integer}) =
        new([
            rand(layer_sizes[i], layer_sizes[i+1]) for i in [1:length(layer_sizes)-1]
        ])
end

但是当我尝试使用它时:

test = MyType([1,2,1])

我收到错误:

ERROR: no method MyType(Array{Int64, 1})

将备用构造函数从Array{Integer}切换到Array{Int64}可以解决问题,但我不想限制使用量。

有关如何做到这一点的任何想法?任何代码审查也将非常感谢。我假设这段代码不是非常“朱利安”(这是一件事吗?)并且会喜欢指向其他人更有用的指针。

1 个答案:

答案 0 :(得分:0)

这有效:

type MyType     
       weight_matrices::Array{Array{FloatingPoint}}

       MyType(layer_sizes::Array{Int}) =
           new([
               rand(layer_sizes[i], layer_sizes[i+1]) for i in [1:length(layer_sizes)-1]
           ])
   end

julia> test = MyType([1,2,1])
MyType([
1x2 Array{FloatingPoint,2}:
 0.477698  0.454376,

2x1 Array{FloatingPoint,2}:
 0.318465
 0.280079])

Julia容器不是共同变体或反变量,因此[1,2,1],即具体类型Int的数组,不是抽象类型Integer数组的子类型

(注意,Int是您的本机整数类型的别名,64位机器上的Int64,32位机器上的Int32)

如果你真的希望你的输入是不同类型的整数,那么参数化输入的类型(使用外部构造函数)

type MyType                                
       weight_matrices::Array{Array{FloatingPoint}}
end

MyType{T<:Integer}(layer_sizes::Array{T}) =
           MyType([rand(layer_sizes[i], layer_sizes[i+1]) for i in                   [1:length(layer_sizes)-1]])

julia> test = MyType([1,2,1])
MyType([
 1x2 Array{FloatingPoint,2}:
 0.28085  0.10863,

2x1 Array{FloatingPoint,2}:
 0.245685
 0.277009])