在 Erlang 中编写 if 语句的最简单方法是什么,其中一部分保护是member(E, L)
,即测试是否E
是列表的成员L
?天真的方法是:
if
... andalso member(E,L) -> ...
end
但 is 不起作用,因为如果我理解正确,member
它不是警卫表达式。哪种方式行得通?
在 Erlang 中编写 if 语句的最简单方法是什么,其中一部分保护是member(E, L)
,即测试是否E
是列表的成员L
?天真的方法是:
if
... andalso member(E,L) -> ...
end
但 is 不起作用,因为如果我理解正确,member
它不是警卫表达式。哪种方式行得通?
正如您所说,成员功能不是有效的守卫。相反,您可能会考虑使用案例模式?可能在 case 表达式中包含您的其他 if 子句。
case {member(E,L),Expr} of
{true,true} -> do(), is_member;
{true,false} -> is_member;
{false,_} -> no_member
end
在 Erlang 的守卫中测试列表成员身份是不可能的。你必须这样做:
f(E, L) ->
case lists:member(E, L) of
true -> ...;
false -> ...
end.
最简单的事情是将守卫视为模式匹配的一部分,即不能或难以在模式本身中表达的部分。所以守卫是一系列守卫测试,而不是布尔表达式。最初的保护语法更容易看出差异,但现在它们看起来像布尔表达式,但它们不是。