我有一个 id 的批次(子列表)列表,我想遍历这个列表并为这批 id 中的每个 id 生成一个工作进程。这些工作人员中的每一个都将查询一些服务,获取结果并将其发送回调用者。简而言之,我想将 s 列表映射id
到通过这些id
s 获得的数据列表。我设法做到了这一点,但我相信这是一种单一的方式:
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
也许像?)。