检查Erlang guard中的成员身份
在Erlang中编写if语句的最简单方法是什么,其中保护的一部分是检查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 -> ...;
成员(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”的用法都更常见。