[英]How do I grow a Julia array in a type-respecting way?
我正在編寫一個搜索集合的函數,並收集一些用戶提供的函數f
和g
的輸出,這些函數應用於發現的東西。
function search_map_collect(f::Function, g::Function)
output = []
# searching through the collection
# oh look we found an x and a y
push!(output, f(x, y))
# whoa, we even found a z
push!(output, g(x, y, z))
# end loopy stuff
return output
end
編寫函數時,輸出將始終具有Array{Any,1}
類型,因為這是空數組的類型。 但是,通常情況下, f
和g
總是返回相同類型T
值。 在這種情況下,像map
這樣的內置函數將返回Array{T,1}
類型的輸出,我希望我的函數表現相同。 有沒有很好的方法可以做到這一點?
如果Julia支持帶簽名的函數類型,這將很容易。 不幸的是,事實並非如此。
如果我可以輕松預測何時首次應用f
或g
,則可以將輸出數組初始化為
output = [f(x_first, y_first)]
設置類型。 不幸的是,我無法預測第一個應用程序。
我意識到我可以做些可怕的事情
function complicated_collect(f::Function, g::Function)
output = Union{}[]
# searching through the collection
# oh look we found an x and a y
if isempty(output)
output = [f(x, y)]
else
push!(output, f(x, y))
end
# whoa, we even found a z
if isempty(output)
output = [g(x, y, z)]
else
push!(output, g(x, y, z))
end
# end loopy stuff
return output
end
但這會使代碼的可讀性大大降低,而且效率也不高。
如果在調用函數時知道返回類型,則可以將其添加為參數。
function test1(t::Type, f::Function)
output = t[]
for x in 1:5
push!( output, f(x) )
end
output
end
test1( Float64, exp )
@code_warntype test1(exp)
由於它是類型穩定的,因此它應該比使用找到的第一個元素的類型更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.