如何在Elixir中编写自己的流功能?

问题描述:

我写了一个简单的Stream.unfold功能,当我这样称呼它的正常工作:如何在Elixir中编写自己的流功能?

a = Stream.unfold({1,2,3}, &my_unfold_func) |> Stream.take(5) 

不过,我似乎无法找到实现包装的一种方式,让我来直接调用我的函数,例如像这样:

a = my_unfold_wrapper() |> Stream.take(5) 

我已经试过是:

def my_unfold_wrapper(), do: Stream.unfold({1,2,3}, &my_unfold_func) 

当我运行这段代码,我得到的错误:

#Stream<[enum: #Function<35.27730995/2 in Stream.unfold/2>, 
funs: [#Function<38.27730995/1 in Stream.take/2>]]> 
[Finished in 0.7s] 

这个问题似乎是该流.take()返回另一个流,我不知何故需要执行转换为一个数组。用Enum.take替换Stream.take似乎有诀窍,这就留下了我如何执行流的问题。

+1

这看起来很好,为了调试这个我们需要更多的信息。什么是你得到的具体错误信息?你能告诉我们'my_unfold_func'的定义吗? –

+0

运行'new'代码时的输出结果如下:#Stream , funs:[#Function ]]> [在0.7s中完成]问题似乎是Stream.take()返回另一个流,我需要执行该流以转换为数组。用Enum.take替换Stream.take似乎有诀窍,这就留下了我如何执行流的问题。另外,如何在SO注释中插入新行?即没有终止评论? – Andy

+1

编辑您的问题以包含您在该评论中输入的错误信息。 –

我想我已经破解了它,后续的代码做相当多我想要的:

Foobar.my_unfold_wrapper() 
|> Stream.take(10) 
|> Stream.into(File.stream!("output.txt", [:write, :utf8])) 
|> Stream.run 

我有这个唯一的问题是现在的输出被串接到一个庞大的线 - 这是我在一个单独的SO问题都提出了一个问题。

+0

这是运行Stream的正确方法。如果你也想要流的值,你可以使用'Enum.to_list/1'而不是'Stream.run/1'得到一个列表。但是对于写入文件'Stream.run'是正确的选择。要流线/添加换行符到一个文件,你应该添加':line'选项。 –

+0

如何将行选项添加到File.stream!呼叫?我试着把它写入:write等,也作为一个单独的参数,在其他选项列表之前或之后,但这些方法都不起作用。 – Andy

+0

编译时使用|> Stream.into(File.stream!(“output.txt”,[],:line)) ,但这似乎没有任何影响。现在使用map函数在每条输出行的末尾附加一个新行。 – Andy