2015-12-03 15 views
5

Tôi muốn xác định một loại xung quanh một FixedSizeArrays.Vec {N, T} trong đó N là một chức năng của tham số type:Expressions tùy thuộc vào các tham số kiểu số nguyên trong định nghĩa kiểu trong Julia không được phép

using FixedSizeArrays 

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

Điều này dẫn đến thông báo lỗi:

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

Rõ ràng, số học đơn giản với tham số kiểu số nguyên không được phép, ngay cả khi kết quả có thể được biết tại thời gian biên dịch. Có ai biết về một cách giải quyết cho giới hạn này?

Trả lời

6

Rõ ràng, số học đơn giản cho với các tham số kiểu số nguyên không được phép

Vâng, đây là một hạn chế với các tham số kiểu. Cách tiêu chuẩn xung quanh điều này là với một tham số kiểu thứ hai. Sau đó bạn có thể thực thi các bất biến thông số với một nhà xây dựng bên trong:

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) 

Ví dụ:

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 
Các vấn đề liên quan