向Erlang中的进程广播消息时出错

向Erlang中的进程广播消息时出错,erlang,erlang-shell,Erlang,Erlang Shell,我是Erlang的新手,我正在尝试让一个Pid向其他几个Pid发送消息 我有一个函数,它以Pid、字符串(消息)和整数R(半径)作为参数 当我调用函数broadcast时,我收到以下消息: faceinsok:broadcast(Pid, "asd", 1). ** exception error: bad argument in function faceinsok:'-broadcast/3-lc$^0/1-0-'/5 (faceinso

我是Erlang的新手,我正在尝试让一个Pid向其他几个Pid发送消息

我有一个函数,它以Pid、字符串(消息)和整数R(半径)作为参数

当我调用函数broadcast时,我收到以下消息:

faceinsok:broadcast(Pid, "asd", 1).                     
** exception error: bad argument
     in function  faceinsok:'-broadcast/3-lc$^0/1-0-'/5 (faceinsok.erl, line 56)
第56行是:

[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],

[F!{broadcast,P,M,R},Friends}| F

再次。在第55行中,您将接收到

{P,Friends}
,并假设
Friends
是一个列表。但我猜不是。因为在第53行中,您正在发送
{self(),Friends}
,并且您无法在atom
Friends
上进行列表编译

如果
Friends
实际上是一个列表,则应该添加守卫检查

  receive
    {P, Friends} when is_list(Friends) ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->
接收
{P,Friends}什么时候是_列表(Friends)->
[F!{广播,P,M,R},朋友}| F

然后检查它是否按您认为的方式工作。

可能重复“改进”代码不同的错误消息,因此我不认为它可以被视为重复。您没有广播问题,您有模式匹配/类型问题。实际上,
朋友
始终是一个列表。在第53行,我发送了一条消息,其中“string”friends和looper收到它并发回列表
friends
。我这样做不对吗?:/You认为它是一个列表(Pid的),或者它应该是一个列表。试着在第56行之前打印它,看看它是什么,就像在最简单的调试中一样。它应该是一个{Pid,string}的列表。也许我没有进行正确的模式匹配?你所说的字符串是什么意思?请检查变量的实际值,这是最简单的方法。@mpm:问题当然出在
Friends
,它不是一个列表,但是
Friends
是一个原子这一事实与它无关。除了你的r埃普利是正确的。
[F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
  receive
    {P, Friends} when is_list(Friends) ->
      [F ! {{broadcast, P, M, R}, Friends} || F <- Friends],
      ok;
    {} ->