检查Erlang guard中的成员身份

检查Erlang guard中的成员身份,erlang,if-statement,guard,Erlang,If Statement,Guard,在Erlang中编写if语句的最简单方法是什么,其中保护的一部分是成员(E,L),即测试E是否是列表L的成员?天真的做法是: if ... andalso member(E,L) -> ... end 但它不起作用,因为如果我理解正确,member不是保护表达式。哪种方法有效?在Erlang中无法测试guard中的列表成员身份。你必须这样做: f(E, L) -> case lists:member(E, L) of true -> ...;

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

if 
  ... andalso member(E,L) -> ...
end

但它不起作用,因为如果我理解正确,
member
不是保护表达式。哪种方法有效?

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

f(E, L) ->
    case lists:member(E, L) of
        true  -> ...;
        false -> ...
    end.

正如您所说,成员功能不是有效的保护。相反,您可以考虑使用案例模式吗?在case表达式中可能包含其他if子句

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

最简单的方法是把警卫看做模式匹配的一部分,在模式本身中不能或难以表达的部分。因此,保护是一系列保护测试,而不是布尔表达式。最初的guard语法更容易看出差异,但现在它们看起来像布尔表达式,而事实并非如此。

Nice。我希望避免使用boolean作为case子句,但至少它让我不必在if语句中嵌套case语句。在case语句中使用boolean非常常见,可能比任何“if”的用法都更常见。