使用Elixir语言中的递归函数流

时间:2016-05-23 08:43:59

标签: recursion stream elixir

在scala中,下面的代码有效(我知道它很奇怪,但我想用递归函数测试流连接)

def ones(s: Stream[Int]): Stream[Int] = 1 #:: ones(s)
ones(Stream.from(1)).take(10).toList

我写了一些elixir代码,它应该等同于scala代码并挂起。如何获得与上面的scala代码相同的效果?

defmodule Ones do
  def ones(s) do
    head = Stream.take(s, 1)
    Stream.concat(head, ones(s))
  end
end

Ones.ones(Stream.iterate(1, &(&1 + 1))) |> Enum.take(10) # hang

1 个答案:

答案 0 :(得分:1)

似乎scala中的#::运算符懒惰地评估了它的正确参数。这就是为什么你可以构建"无限"这样的递归,它仍然有效。在Elixir中没有懒惰评估参数的概念,因此ones(s)总是在最后调用ones(s)导致无限循环。为了避免您需要使用明确处理延迟值的Stream函数来构建结果,例如Stream.resource

相关问题