如何在Elixir中编写自己的流函数?

时间:2016-09-17 12:10:52

标签: elixir

我编写了一个简单的Stream.unfold函数,当我这样称它时它可以正常工作:

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]

问题似乎是Stream.take()返回另一个流,我不知何故需要执行它才能转换为数组。用Enum.take取代Stream.take似乎可以解决问题,这就是我如何执行流的问题。

1 个答案:

答案 0 :(得分:1)

我想我已经破解了它,有点儿。以下代码完全符合我的要求:

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

我现在遇到的唯一问题是输出被连接到一条大线上 - 这是我在一个单独的SO问题中提出的问题。