2011-08-03 22 views
5

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

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

但就是不监守工作,如果我理解正确的话,member不是后卫的表达。哪种方式可行?

回答

12

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

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

不错。我希望避免使用布尔值作为case子句,但至少它让我无需在if语句中嵌套case语句。 –

+1

在case语句中使用布尔值是很常见的,可能比使用“if”时更常见。 –

6

在Erlang中不可能测试一名警卫的名单成员身份。您必须这样做:

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

最简单的事情是要考虑警卫模式匹配的部分,哪些不能,或者说是很难,表达模式本身的一部分。所以后卫是一系列后卫测试而不是布尔表达式。最初的守卫语法使得更容易看出差异,但是现在它们看起来像布尔表达式,但它们不是。