Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Elixir编写自己的流函数?_Elixir - Fatal编程技术网

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

如何用Elixir编写自己的流函数?,elixir,Elixir,我已经编写了一个简单的Stream.unfold函数,当我这样调用它时,它运行良好: a = Stream.unfold({1,2,3}, &my_unfold_func) |> Stream.take(5) a = my_unfold_wrapper() |> Stream.take(5) 但是,我似乎无法找到一种实现包装器的方法,该包装器允许我直接调用我的函数,例如: a = Stream.unfold({1,2,3}, &my_unfold_func) |&

我已经编写了一个简单的Stream.unfold函数,当我这样调用它时,它运行良好:

a = Stream.unfold({1,2,3}, &my_unfold_func) |> Stream.take(5)
a = my_unfold_wrapper() |> Stream.take(5)
但是,我似乎无法找到一种实现包装器的方法,该包装器允许我直接调用我的函数,例如:

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]
#流
[在0.7秒内完成]

问题似乎是Stream.take()正在返回另一个流,我需要执行该流才能将其转换为数组。用Enum.take替换Stream.take似乎可以解决这个问题,这就留下了如何执行流的问题。

我想我已经破解了它。下面的代码基本上满足了我的要求:

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

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

这看起来很好,要调试它,我们需要更多的信息。您收到的具体错误消息是什么?你能告诉我们my_unfold_func的定义吗??运行“new”代码时产生的输出如下:#Stream[在0.7s内完成]问题似乎是Stream.take()返回另一个流,我需要以某种方式执行该流以转换为数组。用Enum.take替换Stream.take似乎可以解决这个问题,这就留下了如何执行流的问题。另外,如何在SO注释中插入新行?i、 e.不终止评论?编辑您的问题,以包括您在评论中输入的错误信息。这是运行流的正确方式。如果还需要流值,可以使用
Enum.to_list/1
而不是
stream.run/1
获取列表。但是对于写入文件
流,run
是正确的选择。要将行流化/添加换行到文件中,您应该添加
:line
选项。如何将行选项添加到file.stream!呼叫我试着把它和:write etc一起放在另一个选项列表之前或之后,作为一个单独的参数,但这些方法都不起作用。我让它用|>Stream.into(File.Stream!(“output.txt”,[],:line))编译,但这似乎没有任何影响。现在使用map函数在每个输出行的末尾追加一个新行。您是对的,添加:line选项应该没有什么区别,因为它是默认的。它可能只用于读取文件流。抱歉搞混了!