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,我有这个管道 events |> Task.async_stream(&expensive_func/1) |> Enum.to_list 将返回以下数据: [ok: {item}, ok: {item} ... ] 因此,为了得到一个项目数组,[item,item]我对它进行了如下后处理: events |> Task.async_stream(&expensive_func/1) |> Enum.to_list |> Enum.

我有这个管道

 events
 |> Task.async_stream(&expensive_func/1)
 |> Enum.to_list
将返回以下数据:

[ok: {item}, ok: {item} ... ]
因此,为了得到一个项目数组,
[item,item]
我对它进行了如下后处理:

 events
 |> Task.async_stream(&expensive_func/1)
 |> Enum.to_list
 |> Enum.map(fn {:ok, event} -> event end)
有没有更优雅的方法可以做到这一点?

另一种方法:

events
|> Task.async_stream(&expensive_func/1))
|> Enum.map(&(elem(&1,1)))

警告:由于我们直接访问每个
任务
返回的元组的第二个元素,因此不进行任何检查以确保任务已正确运行。您可以在
:ok
上添加模式匹配来修复该问题(如您在问题中所做的)。

这里要考虑的主要问题是:任务可能会失败。如果期望的行为是丢弃它们,只需直接使用示例中的示例并明确丢弃它们:

事件
|>Task.async\u流(&U func/1)
|>枚举减少([],fn
{:好的,事件},acc->[事件| acc]
_,acc->acc#放弃故障
(完)
|>Enum.reverse()
另一种选择是依赖任务的返回值(如果失败时返回例如
nil
),则可以直接使用:

事件
|>Task.async\u流(&U func/1)
|>枚举到_列表()
|>关键字.values()


FWIW,如果由于函数未处理
:error

而导致至少一个任务失败,则原始解决方案将引发
MatchError

一个问题,为什么需要反向操作?Enum.reduce也在反转它?将项目预先添加到链表
[event | acc]
比添加
acc++[event]
要快得多,这就是为什么上面的代码一直在预先添加它们,这会反转原始输入(LIFO)。mm我认为reduce可能会减慢它的速度,我收到:*(退出)退出时间:Task.Supervised.stream(5000)**(EXIT)time out我从未经历过这种情况,
Enum.reduce/3
极不可能会减慢速度。如果<代码>枚举。toyList](/Cult>在中间)在您的特定情况下执行这个技巧,只是在 EnUM之前嵌入它。仅供参考。@Botonomous这是因为它在
上的模式不匹配:ok
,或者我遗漏了什么?不,这是因为你隐藏了元素(0)。ok@Botonomous,我想我选择了一个错误的措辞。谢谢你的反馈,我已经编辑了答案来纠正这一点。