haz*_*haz 2 erlang functional-programming
我对 Erlang 很陌生(阅读“并发世界的软件”)。从我所读到的,我们将两个过程链接在一起以形成一个可靠的系统。
但是如果我们需要两个以上的进程,我认为我们应该将它们连接成一个环。尽管这与我的实际问题略有不同,但如果这不正确,请告诉我。
给出一个列表PIDs:
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
我想在{My_Pid, Linked_Pid}元组环中形成这些:
[{1,2},{2,3},{3,4},{4,5},{5,1}]
Run Code Online (Sandbox Code Playgroud)
我无法创建一个优雅的解决方案来添加最终{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)).
Run Code Online (Sandbox Code Playgroud)
我在查看我的joinLinks函数时感到畏缩-list:last很慢(我认为),而且它看起来不太“实用”。
有没有更好,更惯用的解决方案?
如果其他函数式程序员(非 Erlang)偶然发现了这一点,请发布您的解决方案 - 概念是相同的。
使用lists:zip与原来的名单和“旋转”的版本:
1> L=[1,2,3].
[1,2,3]
2> lists:zip(L, tl(L) ++ [hd(L)]).
[{1,2},{2,3},{3,1}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |