【发布时间】:2019-04-08 04:09:39
【问题描述】:
我有一个 id 的批次(子列表)列表,我想遍历这个列表并为这批 id 中的每个 id 生成一个工作进程。这些工作人员中的每一个都将查询一些服务,获取结果并将其发送回调用者。简单来说,我想将ids 的列表映射到我通过ids 获得的数据列表。我设法做到了这一点,但我相信这是一种单一的方式:
lists:map(fun(Ids) ->
Pids = [spawn_link(fun() ->
Result = [...] % Here goes a side-effect operation (http request)
Self ! {received_data, process(Result)}
end) || Id <- Ids],
[receive {received_data, Data} -> Data end || _Pid <- Pids],
end, JobChunks)))
在这种情况下,如您所见,我误用了 map 函数,因为它被设计为无副作用。但我没有看到其他选择。有foreach(),但它仅用于运行副作用并仅返回ok,而在我的情况下,我也想保留列表的形状。在 Haskell 中有一个方便的类型类 Traversable 和 traverse 函数,它正是这样做的:运行 fmap 并同时允许您对每个项目执行操作(效果)。 Erlang中有类似的东西吗? (也许像smap?)。
【问题讨论】:
标签: functional-programming erlang erlang-otp map-function traversable