检查Erlang警卫的成员资格

时间:2011-08-03 13:57:20

标签: erlang if-statement guard

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

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

但这是行不通的,如果我理解正确,member不是守卫表达。哪种方式有用?

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

无法在Erlang中测试防护中的列表成员资格。你必须这样做:

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

答案 2 :(得分:2)

最简单的方法是将防护视为模式匹配的一部分,模式匹配中不能或难以表达的部分。因此,一个守卫是一系列守卫测试,而不是布尔表达式。原始的保护语法使得更容易看到差异,但现在它们看起来像布尔表达式,它们不是。