2017-04-07 44 views
3

我不明白以下行爲定製typealias類型錯誤typeassert

a = [1,2,3] 
a::Vector # works 

d = Dict(0=>a) 
typealias DictVector{K,V} Dict{K, Vector{V}} 
d::DictVector # fails 

錯誤是以下

TypeError: typeassert: expected Dict{K,Array{V,1}}, got 
Dict{Int64,Array{Int64,1}} 
    in include_string(::String, ::String) at loading.jl:441 
    in eval(::Module, ::Any) at boot.jl:234 
    in (::Atom.##65#68)() at eval.jl:40 
    in withpath(::Atom.##65#68, ::Void) at utils.jl:30 
    in withpath(::Function, ::Void) at eval.jl:46 
    in macro expansion at eval.jl:109 [inlined] 
    in (::Atom.##64#67{Dict{String,Any}})() at task.jl:60 

但是Vector是本身typealias Vector{T} Array{T,1}所以就是這兩種情況之間的決定性的區別?

任何澄清是高度appriciated

回答

4

你是對的,應該工作。看起來這是舊版系統中的一個bug,在0.5。它在即將到來的0.6版本中得到修復。

這裏有一個可能的解決方法爲0.5:

julia> typealias DictVector{K,V<:Vector} Dict{K,V} 
Dict{K,V<:Array{T,1}} 

julia> d::DictVector 
Dict{Int64,Array{Int64,1}} with 1 entry: 
    0 => [1,2,3] 

julia> isa(d, DictVector) 
true 
+0

非常感謝澄清。我很高興這本該工作 – schlichtanders