簡體   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