2014-02-11 4 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}) 

Switching альтернативный конструктор от 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]) 

Julia контейнеры не со- или противопоказан вариантом, так [1,2,1], который представляет собой массив конкретного типа Int не подтип массива абстрактного типа Integer

(Примечание, Int - это псевдоним для вашего собственного целочисленного типа, Int64 на 64-битных машинах, Int32 на 32-разрядных машинах)

Если вы действительно хотите, чтобы ваш ввод представлял собой разные типы целых чисел, тип ввода (используя внешний конструктор)

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]) 
Смежные вопросы