在Erlang中编写if语句的最简单方法是什么,其中的一部分后卫是member(E, L)
,即测试E
是否为列表L
的成员?天真的做法是:检查Erlang后卫的成员
if
... andalso member(E,L) -> ...
end
但就是不监守工作,如果我理解正确的话,member
不是后卫的表达。哪种方式可行?
在Erlang中编写if语句的最简单方法是什么,其中的一部分后卫是member(E, L)
,即测试E
是否为列表L
的成员?天真的做法是:检查Erlang后卫的成员
if
... andalso member(E,L) -> ...
end
但就是不监守工作,如果我理解正确的话,member
不是后卫的表达。哪种方式可行?
如您所说,会员功能不是有效的警卫。相反,你可能会考虑使用案例模式?可能会在case表达式中包含其他if-clause。
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.
最简单的事情是要考虑警卫模式匹配的部分,哪些不能,或者说是很难,表达模式本身的一部分。所以后卫是一系列后卫测试而不是布尔表达式。最初的守卫语法使得更容易看出差异,但是现在它们看起来像布尔表达式,但它们不是。
不错。我希望避免使用布尔值作为case子句,但至少它让我无需在if语句中嵌套case语句。 –
在case语句中使用布尔值是很常见的,可能比使用“if”时更常见。 –