gpt4 book ai didi

functional-programming - Erlang:做一个环

转载 作者:行者123 更新时间:2023-12-05 08:40:49 26 4
gpt4 key购买 nike

我对 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)偶然发现了这个问题,请发布您的解决方案 - 概念是相同的。

最佳答案

lists:zip 与原始列表及其“旋转”版本一起使用:

1> L=[1,2,3].
[1,2,3]
2> lists:zip(L, tl(L) ++ [hd(L)]).
[{1,2},{2,3},{3,1}]

关于functional-programming - Erlang:做一个环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53275962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com