Как проверить, является ли PID членом списка PID в Erlang?

У меня есть функция, которая устанавливает значение для процесса Pid, ​​и у меня может быть процесс, зависящий от другого. Поэтому, если я устанавливаю значение для процесса, я также должен установить значение для процессов, которые от него зависят. Однако, если существует круг между процессами

i.e. A depends on B and B depends on A 

то я хочу вернуть сообщение об ошибке.

Я пытаюсь сделать это, передавая список PID, которые уже изменили значения, поэтому, если я дважды сталкиваюсь с одним и тем же Pid (проверив, является ли он членом списка PID), вся функция останавливается. Это мой код:

set_values(Pid, Value, PidSet, PidList) ->
  case lists:member(Pid, PidList) of 
    false -> io:format("Setting Value~n"),
    lists:map(fun(Pid) ->
     Pid ! {self(), set_value, Value, [Pid | PidList]} end, PidSet);
    true -> io:format("circle_detected~n"),
    Pid ! {circle_detected}
  end.

Когда я запускаю его, я получаю эту ошибку:

=ERROR REPORT==== 2-Nov-2014::17:47:45 ===
Error in process <0.888.0> with exit value: {badarg,[{lists,member,
[<0.888.0>,empty_list],[]},{process,set_viewer_values,4,[{file,"process.erl"},{line,56}]},
{process,looper,2,[{file,"process.erl"},{line,116}]}]}

Насколько я понимаю, я даю плохие аргументы функциям lists:member. Что я должен делать?

Спасибо


person sokras    schedule 02.11.2014    source источник


Ответы (1)


Если вы прочитали свое сообщение об ошибке, у вас есть {lists,member, [<0.888.0>,empty_list] ..., где lists — модуль, member — имя функции, а [<0.888.0>,empty_list] — аргументы (два), представленные в виде списка. Итак, вы делаете вызов lists:nenber/2 с переменной PidList, равной atom empty_list. И это дает вам ошибку.

Поэтому вам нужно посмотреть, как вызывается ваша функция (предпочтительно), или создать какое-то соответствие шаблону на PidList, например

set_values(Pid, Value, PidSet, _PidList = empty_list) ->
   ...
person mpm    schedule 02.11.2014
comment
спасибо, оказывается, я все-таки звонил empty_list :) - person sokras; 02.11.2014
comment
Такое случается :) Помните, что вы можете сопоставлять шаблоны на [], поэтому нет необходимости в абстракции empty_list. И вы можете попробовать использовать dialyzer, который, вероятно, предупредит вас о таком типе -ошибка. - person mpm; 02.11.2014