Я довольно новичок в 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
медленно (я думаю), и она не выглядит очень "функциональной".
Есть ли лучшее, более идиоматическое решение для этого?
Если другие функциональные программисты (не Эрланг) наткнулись на это, пожалуйста, опубликуйте свое решение - концепции те же.