检查Erlang警卫的成员资格

Lit*_*les 6 erlang if-statement guard

在Erlang中编写if语句的最简单方法是什么,其中一部分守卫是member(E, L),即测试if是否E是列表的成员L?天真的方法是:

if 
  ... andalso member(E,L) -> ...
end
Run Code Online (Sandbox Code Playgroud)

但是,因为我理解正确,member不是一个守卫表达是行不通的.哪种方式有效?

D.N*_*bon 13

正如您所说,会员功能不是有效的警卫.相反,你可以考虑使用案例模式?可能在case表达式中包含其他if子句.

case {member(E,L),Expr} of
  {true,true} -> do(), is_member;
  {true,false} -> is_member;
  {false,_} -> no_member
end
Run Code Online (Sandbox Code Playgroud)


Ada*_*erg 6

在Erlang中无法测试防护中的列表成员身份.你必须这样做:

f(E, L) ->
    case lists:member(E, L) of
        true  -> ...;
        false -> ...
    end.
Run Code Online (Sandbox Code Playgroud)