【发布时间】:2019-04-15 23:43:34
【问题描述】:
我对 Erlang 很陌生(阅读“并发世界的软件”)。根据我的阅读,我们将两个进程连接在一起以形成一个可靠的系统。
但如果我们需要两个以上的进程,我认为我们应该将它们连接成一个环。虽然这与我的实际问题略有相干,但如果这不正确,请告诉我。
给定PIDs的列表:
[1,2,3,4,5]
我想在{My_Pid, Linked_Pid} 元组的环中形成这些:
[{1,2},{2,3},{3,4},{4,5},{5,1}]
我无法创建一个优雅的解决方案来添加最终的 {5,1} 元组。
这是我的尝试:
% linkedPairs takes [1,2,3] and returns [{1,2},{2,3}]
linkedPairs([]) -> [];
linkedPairs([_]) -> [];
linkedPairs([X1,X2|Xs]) -> [{X1, X2} | linkedPairs([X2|Xs])].
% joinLinks takes [{1,2},{2,3}] and returns [{1,2},{2,3},{3,1}]
joinLinks([{A, _}|_]=P) ->
{X, Y} = lists:last(P)
P ++ [{Y, A}].
% makeRing takes [1,2,3] and returns [{1,2},{2,3},{3,1}]
makeRing(PIDs) -> joinLinks(linkedPairs(PIDs)).
看到我的 joinLinks 函数时,我感到畏缩 - list:last 很慢(我认为),而且看起来不是很“实用”。
有没有更好、更惯用的解决方案?
如果其他函数式程序员(非 Erlang)偶然发现此问题,请发布您的解决方案 - 概念相同。
【问题讨论】:
标签: functional-programming erlang