类型断言的奇怪行为

abe*_*ysh 1 julia

为简单起见,假设我定义了以下函数:

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是多派遣我希望这样的功能很好地工作(和似乎是合乎逻辑/直觉以及)

Gni*_*muc 5

暗示:

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}是类型参数,这些参数在朱莉娅不变.