如何从Elixir中的递归函数返回/生成值?

时间:2015-12-27 09:51:12

标签: elixir

这似乎是一件很简单的事情,但我似乎并没有找到一个简单的答案,我可以随时找到。

所以我想说我有一个像这样的Elixir函数:

   def fetch_card_ids(offset, total_cards) when offset < total_cards do
       url = "http://some.domanin?offset=#{offset}"
       response = HTTPotion.get url

       #return or yield response here

       fetch_card_ids(offset+24,total_cards)
   end

在C#中,我可以在迭代某些东西时产生一个返回值,当然这与递归不同但是:我可以在elixir的递归函数中做类似的事情吗?

当然,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:5)

如果您想要做的是&#34; stream&#34;对呼叫者的响应,然后Stream是一个很好的方法。例如,您可以使用Stream.unfold/2

def fetch_card_ids(offset, total_cards) do
  Stream.unfold offset, fn
    off when off < total_cards ->
      resp = HTTPotion.get(url)
      {resp, off + 24}
    _ ->
      nil
  end
end

此流将&#34;产生&#34;每次提取时都会响应,并在offset大于total_cards时停止。

答案 1 :(得分:2)

如何以这种方式使用Streams

top = div(total_cards,24) +1 # integer division
result = Stream.map( 0..top, fn (offset) -> 
  url = "http://some.domanin?offset=#{24*offset}"
  HTTPotion.get url
  end ) |> Enum.to_list

这里Enum.to_list只是&#34;产生&#34;最后的列表,但您也可以使用Stream.take

之类的内容在渐进时间内从该列表进行处理