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