2014-02-11 107 views
3

我對朱莉婭完全陌生(今天早些時候纔開始),所以如果這是一個愚蠢的問題,請原諒我,但儘管愛上這門語言,但我沒有發現很多偉大的調試幫助那裏。爲什麼我的類型構造函數不被識別

基本上我只想定義一個方法的替代構造函數,該方法將在包含任何類型的Integer(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

總之,不變性:https://groups.google.com/forum/#!topic/julia-dev/slxzNLXJdlY。如果別人沒有毆打我,我可以明天寫出來作爲答案。 – StefanKarpinski

回答

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]) 

朱莉婭容器不是共或反變體,所以[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]) 
相關問題