2014-09-04 8 views
8

Die folgenden Werke:Julia: warum müssen parametrische Typen äußere Konstruktoren haben?

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

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

Dies gilt nicht:

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

Um den zweiten Fall zur Arbeit zu kommen, muss man den Konstruktor außerhalb der Typdeklaration deklarieren. Dies ist leicht unerwünscht. Meine Frage ist, warum dieses Problem aus einer Julia-Design-Sicht existiert, so dass ich besser über das Julia-Typ-System nachdenken kann.

Vielen Dank.

Antwort

8

Dies funktioniert:

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

, die ich von reading the manual herausgefunden, aber ich muß mich nicht wirklich inneren Bauer zugeben verstehen, dass gut, vor allem für die Parametertypen. Ich denke es ist, weil Sie tatsächlich eine Familie von Typen definieren, so dass der innere Konstruktor nur für jeden einzelnen Typ sinnvoll ist - daher müssen Sie den {Int} angeben, um welchen Typ Sie möchten. Sie können einen äußeren Konstruktor hinzufügen, um es einfacher zu machen, das heißt

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

ich denke, es wäre gut, es auf der Julia Fragen Seite zu bringen, weil ich wie dieser äußeren Helfer Konstruktor fühlen könnte standardmäßig zur Verfügung gestellt werden.

EDIT: Diese weist auf die Probleme bei der Bereitstellung eines äußeren Konstruktors standardmäßig.

Verwandte Themen