我正在编写一个搜索集合的函数,并收集一些用户提供的函数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支持signatures的函数类型,那么这很容易。不幸的是,它没有。
如果我可以轻松预测首次应用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
但这会使代码的可读性降低,而且效率也不高。
答案 0 :(得分:5)
如果您在调用该函数时知道返回类型, 你可以把它作为一个参数添加。
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)
由于它是类型稳定的,它应该更有效 而不是使用找到的第一个元素的类型。