繁体   English   中英

如何以尊重类型的方式生长Julia数组?

[英]How do I grow a Julia array in a type-respecting way?

我正在编写一个搜索集合的函数,并收集一些用户提供的函数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支持带签名的函数类型,这将很容易。 不幸的是,事实并非如此。


如果我可以轻松预测何时首次应用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)

由于它是类型稳定的,因此它应该比使用找到的第一个元素的类型更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM