【问题标题】:Generate infinite sequence in Elixir在 Elixir 中生成无限序列
【发布时间】:2018-07-28 12:15:39
【问题描述】:

如何实现一个无限序列生成器,我可以使用Stream 库函数对其进行操作?

我想用它来生成前 n 个素数。我有一个可行的递归方法,但我更喜欢枚举和管道。

我已经看到在 python 中使用生成器完成了这项工作:

def number_generator():
  n = 3
  while True:
    yield n
    n += 2

是否有在 Elixir 中生成此类序列的内置函数,或简单的 DIY 替代方案?这个模式在 Elixir 中有名字吗?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您至少有两个选项可以在 Elixir 中生成流。最通用的是Stream.unfold

    Stream.unfold(3, fn(x) -> {x, x + 2} end)
    
    # or
    
    Stream.unfold(3, &({&1, &1 + 2}))
    

    但在您的情况下,您可以使用更简单的Stream.iterate

    Stream.iterate(3, fn(x) -> x + 2 end)
    
    # or
    
    Stream.iterate(3, &(&1 + 2))
    

    【讨论】:

    • 太棒了!正是我需要的。
    • 现在我将如何实现 Python 的 next() 的想法,它获取流中的下一个项目?
    • @ThomasBrowne Elixir 中没有这样的东西。流生成器函数可能有副作用(例如在文件流中推进指针),因此您必须使用Enum.reduceEnum 模块中的另一个函数枚举流来使用它。你到底想达到什么目的?通常它只需要稍微不同的方式来思考问题。
    【解决方案2】:

    Stream.iterate/2 来救援:

    generator = Stream.iterate(3, &(&1+2))
    #⇒ #Function<61.8243704/2 in Stream.unfold/2>
    generator |> Enum.take(5)
    #⇒ [3, 5, 7, 9, 11]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2016-10-12
      • 2013-08-03
      • 1970-01-01
      • 2014-01-21
      • 2015-07-14
      相关资源
      最近更新 更多