2014-09-04 33 views
8

aşağıdaki çalışır:Julia: Neden parametrik türlerin dış kurucuları olmalı?

type TypeA 
     x :: Array 
     y :: Int 
     TypeA(x :: Array) = new(x, 2) 
     end 

julia> y = TypeA([1,2,3]) 
TypeA([1,2,3],2) 

Bu değildir: çalışmak için ikinci davayı almak için

type TypeB{S} 
     x :: Array{S} 
     y :: Int 
     TypeB{S}(x:: Array{S}) = new(x,2) 
     end 

julia> y = TypeB([1,2,3]) 
ERROR: `TypeB{S}` has no method matching TypeB{S}(::Array{Int64,1}) 

, tek tip beyanının dışında yapıcı ilan etmek vardır. Bu hafif istenmeyen bir durumdur. Benim sorum, bu sorunun bir Julia-tasarım bakış açısından var neden bu yüzden Julia tipi sistemi hakkında daha iyi bir neden olabilir.

Teşekkür ederiz.

cevap

8

Bu çalışır:

Ben reading the manual tarafından anladım
type TypeB{S} 
    x::Array{S} 
    y::Int 
    TypeB(x::Array{S}) = new(x,2) 
end 
TypeB{Int}([1,2,3]) 

, ama ben gerçekten iç kurucular anlamıyorum itiraf gerektiğini de özellikle parametrik türleri için. Bence, aslında bir tür ailesini tanımladığınız için, iç kurucu her bir tip için sadece mantıklıdır - bu nedenle, istediğiniz türü söylemek için {Int}'u belirtmeniz gerekir. Sen, kolaylaştırmak için bir dış kurucu ekleyebilirsiniz yani

type TypeB{S} 
    x::Array{S} 
    y::Int 
    TypeB(x::Array{S}) = new(x,2) 
end 
TypeB{S}(x::Array{S}) = TypeB{S}(x) 
TypeB([1,2,3]) 

Bunu ben varsayılan olarak temin edilebilir bu dış yardımcı yapıcı gibi hissediyorum çünkü Julia sorunlar sayfasında getirmek için iyi olacağını düşünüyorum.

DÜZENLEME: Bu Julia issue, varsayılan olarak bir dış kurucu sağlamanın sorunlarına dikkat çeker.