List Erlang:循环通过列表-badarg

List Erlang:循环通过列表-badarg,list,erlang,List,Erlang,我的问题是,在我使用列表的函数中:任何函数都无法完成对给定列表的查看。下面是我得到的错误: {badarg, [{genserver,request,3, [{file, [99,58,47,85,115,101,114,115,47,68,97,118,105,100,47, 68,101,115,107,116,111,112,47,71,106,111,114,100,32, 102,114,195,131,194,

我的问题是,在我使用列表的函数中:任何函数都无法完成对给定列表的查看。下面是我得到的错误:

{badarg,
[{genserver,request,3,
     [{file,
          [99,58,47,85,115,101,114,115,47,68,97,118,105,100,47,
           68,101,115,107,116,111,112,47,71,106,111,114,100,32,
           102,114,195,131,194,165,110,32,103,114,117,110,100,
           101,110,47,103,101,110,115,101,114,118,101,114,46,101,
           114,108]},
      {line,33}]},
 {lists,any,2,[{file,"lists.erl"},{line,1223}]},
 {server,loop,2,
     [{file,
          [99,58,47,85,115,101,114,115,47,68,97,118,105,100,47,
           68,101,115,107,116,111,112,47,71,106,111,114,100,32,
           102,114,195,131,194,165,110,32,103,114,117,110,100,
           101,110,47,115,101,114,118,101,114,46,101,114,108]},
      {line,27}]},
 {genserver,loop,2,
     [{file,
          [99,58,47,85,115,101,114,115,47,68,97,118,105,100,47,
           68,101,115,107,116,111,112,47,71,106,111,114,100,32,
           102,114,195,131,194,165,110,32,103,114,117,110,100,
           101,110,47,103,101,110,115,101,114,118,101,114,46,101,
           114,108]},
      {line,13}]}]}}
我使用以下代码填充列表:

channels = channels ++ [{Channel}]
其中,频道是一个字符串,频道初始化为[]。最后,以下第27条是导致错误的原因:

#24 loop(St, {Nick, PID, disconnect}) ->
#25     case lists:keymember(Nick, 1, St#server_st.users) of
#26         false   -> {{error, user_not_connected, "Nick doesn't exist on server."}, St};      
#27         true -> case lists:any(fun(F) -> genserver:request(F, {Nick, PID, is_member}) end, St#server_st.channels) of
#28             true -> {{error, leave_channels_first, "Still in a channel."}, St};
#29             false -> {ok, St#server_st{users = lists:delete({Nick, PID}, St#server_st.users)}}
#30         end
#31     end;

其中F用作PID。我能发现的问题是如何填充列表,但无论我如何扭曲和旋转列表,最终都会得到相同的结果。

错误来自genserver:request/2调用,请检查传递的参数是否对函数定义有效。例如,根据上面的信息,第27行中的F将是一个包含字符串而不是PID的元组。

错误报告指出,当显示的行调用genserver:request/2时,您在函数genserver:request/3中使用了错误的参数。验证您的帖子,如果您提供更多的上下文,尤其是server.erl第27行附近的代码,会更好。@Pascal否正确,genserver/2(PID,Tuple)调用genserver/3(PID,Tuple,Timeout)。我看不出函数的更多部分对问题有多大帮助,但用它编辑了文章。我可以将F转换为PID,还是需要先将其存储为PID?尝试使用list_to_PID函数将F转换为PID,但它仍然不接受。我认为最好将其存储为PID。在使用该进程之前,您可以通过调用process_info/1检查该进程是否仍处于活动状态。当我将其存储为pid时,无法使其工作,但将其存储为atom时效果更好。然而,第27行仍然引起问题,使函数退出时带有“进程中的错误和退出值:{case#u子句,false},[{genserver,loop,2,[{file,…”我发现这很奇怪,因为我捕获了false子句,所以它应该与给定的元组一起退出。看起来第27行在server:loop/2中。相反,您应该检查genserver:loop/2,正如错误消息所示。genserver:loop/2是保持服务器运行的原因,并且函数已经过彻底测试,所以这是我在ser中正在做的事情如果我从我的函数中删除整个第二个case语句,并用{ok,St#server_St{users=list:delete({Nick,PID},St#server_St.users})替换它,它就可以正常工作,所以我认为第27行就是问题所在。