gpt4 book ai didi

types - 如何以类型尊重的方式增长 Julia 数组?

转载 作者:行者123 更新时间:2023-12-01 10:21:13 25 4
gpt4 key购买 nike

我正在编写一个函数,用于搜索集合并收集一些用户提供的函数 fg 的输出,这些函数应用于它找到的内容。

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},因为这是空数组的类型。但是,通常情况下 fg 总是返回相同类型 T 的值。在这种情况下,像 map 这样的内置函数将返回 Array{T,1} 类型的输出,并且我希望我的函数具有相同的行为。有什么好的方法可以做到这一点吗?


如果 Julia 支持 signatures 的函数类型,这很容易。不幸的是,事实并非如此。


如果我可以轻松预测何时首先应用 fg,我可以将输出数组初始化为

  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)

由于它是类型稳定的,所以它应该更高效而不是使用找到的第一个元素的类型。

关于types - 如何以类型尊重的方式增长 Julia 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com