为简单起见,假设我定义了以下函数:
function returnVectorOrMatrix()
vals = Array(Array{Float32,1}, 10) # vector in this definition
return vals::Array{Array{Float32},1}
end
arr = returnVectorOrMatrix()
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,产生以下错误:
ERROR: type: typeassert: expected Array{Array{Float32,N},1},
got Array{Array{Float32,1},1}
Run Code Online (Sandbox Code Playgroud)
有没有人有一个很好的逻辑推理,为什么这种情况正在发生/以这种方式设计?由于Array{Array{Float32,1},1}只是一个特例Array{Array{Float32,N},1}有N = 1这样因为Julia是多派遣我希望这样的功能很好地工作(和似乎是合乎逻辑/直觉以及)
暗示:
julia> Array{Float32,1} <: Array{Float32}
true
julia> Array{Array{Float32,1},1} <: Array{Array{Float32},1}
false
julia> Array{Array{Float32,1},1} <: Array{Array{Float32,1}}
true
Run Code Online (Sandbox Code Playgroud)
你现在能找到任何线索吗?
实际上,这Array{Array{Float32,1},1}是一个参数类型,
julia> Array{Array{Float32,1},1} <: Array{Array{Float32},1}
false
Run Code Online (Sandbox Code Playgroud)
我认为这里的机制与以下情况相同:
julia> Array{Int32,1} <: Array{Int,1}
false
Run Code Online (Sandbox Code Playgroud)
即使Int32是特例Int,朱莉娅也会在这里归还假.
Bacause Array {Array {Float32,1},1}只是Array {Array {Float32,N},1}的一个特例,N = 1
所以因为这个说法是不正确的Array{Float32,1}并且Array{Float32,N}是类型参数,这些参数在朱莉娅不变.