2014-11-02 3 views
0

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

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

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

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

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}]}]} 

Из того, что я понимаю, что дают плохие аргументы списка: функции члена. Что мне делать?

Благодаря

ответ

2

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

Таким образом, вы должны смотреть в то, как вы Funciton вызывается (предпочитаемое), или создать какой-то матч картины на PidList как

set_values(Pid, Value, PidSet, _PidList = empty_list) -> 
    ... 
+0

благодаря Оказывается, я звала 'empty_list' после всех :) – sokras

+0

Это происходит :) Помните, что вы можете сопоставить шаблон по '[]', поэтому нет необходимости в абстракции 'empty_list'. И вы можете попробовать использовать [dialyzer] (http://www.erlang.org/doc/apps/dialyzer/dialyzer_chapter.html), который, вероятно, предупредит вас о такой ошибке типа. – mpm

Смежные вопросы