2015-12-03 2 views
5

erlaubt Ich möchte einen Typ um einen FixedSizeArrays.Vec {N, T} zu definieren, wobei N eine Funktion vom Typ Parameter ist:Ausdrücke auf Integer-Typ-Parameter in Typdefinitionen in Julia abhängig sind nicht

using FixedSizeArrays 

type MT{N} 
    x::Vec{N,Int} 
    y::Vec{N+1,Int} 
end 

Daraus ergibt sich die Fehlermeldung:

ERROR: MethodError: `+` has no method matching +(::TypeVar, ::Int64) 
Closest candidates are: 
    +(::Any, ::Any, ::Any, ::Any...) 
    +(::Int64, ::Int64) 
    +(::Complex{Bool}, ::Real) 
    ... 

Scheinbar einfache Arithmetik mit Parameter integer-Typ nicht zulässig ist, auch wenn das Ergebnis kann bei der Kompilierung bekannt sein. Kennt jemand eine Problemumgehung für diese Einschränkung?

Antwort

6

Scheinbar einfache Arithmetik für mit Integer-Typ Parameter ist nicht

erlaubt

Ja, das ist eine Einschränkung mit Typ-Parametern. Der Standard ist dies mit einem zweiten Typparameter. Sie können dann die Parameter Invarianten mit einem inneren Konstruktor erzwingen:

type MT{N,Np1} 
    x::Vec{N,Int} 
    y::Vec{Np1,Int} 
    function MT(x,y) 
     N+1==Np1 || throw(ArgumentError("mismatched lengths; y must be one element longer than x")) 
     new(x,y) 
    end 
end 
# Since we define an inner constructor, we must also provide the 
# outer constructor to allow calling MT without parameters 
MT{N,M}(x::Vec{N,Int}, y::Vec{M,Int}) = MT{N,M}(x,y) 

Beispiel:

julia> MT(Vec(1,2,3),Vec(1,2,3,4)) 
MT{3,4}(FixedSizeArrays.Vec{3,Int64}((1,2,3)),FixedSizeArrays.Vec{4,Int64}((1,2,3,4))) 

julia> MT(Vec(1,2,3),Vec(1,2,3)) 
ERROR: ArgumentError: mismatched lengths; y must be one element longer than x