2015-09-10 69 views
1

为简单起见,假设我有以下函数定义:奇怪的行为断言

function returnVectorOrMatrix() 
    vals = Array(Array{Float32,1}, 10) # vector in this definition 
    return vals::Array{Array{Float32},1} 
end 

arr = returnVectorOrMatrix() 

哪位给我很大的惊喜生成以下错误:

ERROR: type: typeassert: expected Array{Array{Float32,N},1}, 
got Array{Array{Float32,1},1} 

有没有人有一个很好的逻辑推理为什么会发生这种情况/是以这种方式设计的? 因为Array{Array{Float32,1},1}Array{Array{Float32,N},1}N = 1所以鉴于Julia是多派遣我希望这样的功能很好地工作只是一个特例(和似乎是合乎逻辑/直觉以及)

回答

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 

你现在能找到任何线索吗?

其实

,该Array{Array{Float32,1},1}parametric type

julia> Array{Array{Float32,1},1} <: Array{Array{Float32},1} 
false 

我认为这里的机制是相同的情况下:

julia> Array{Int32,1} <: Array{Int,1} 
false 

即使Int32Int一个特例,朱莉娅会在这里返回一个错误。

Bacause Array{Array{Float32,1},1} is just a special case of Array{Array{Float32,N},1} with N = 1

所以这种说法是不正确的,因为Array{Float32,1}Array{Float32,N}是类型参数,这些参数在朱莉娅不变。

+0

感谢您解决这个问题!欣赏! – aberdysh

0

我认为问题很简单,Array {Float32}确实是Array {Float32,N},而不是Array {Float32,1}(与Vector {Float32}相同)。