2015-09-10 72 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}相同)。