6

What is the simplest way to write an if statement in Erlang, where a part of the guard is member(E, L), i.e., testing if E is a member of the list L? The naive approach is:

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

But is does not work becuase, if I understand correctly, member is not a guard expression. Which way will work?

Little Bobby Tables
  • 5,261
  • 2
  • 39
  • 49

3 Answers3

13

Member functionality is, as you say, not a valid guard. Instead you might consider using a case pattern? It's possibly to include your other if-clauses in the case expression.

case {member(E,L),Expr} of
  {true,true} -> do(), is_member;
  {true,false} -> is_member;
  {false,_} -> no_member
end
D.Nibon
  • 2,883
  • 1
  • 19
  • 17
6

It is not possible to test list membership in a guard in Erlang. You have to do this:

f(E, L) ->
    case lists:member(E, L) of
        true  -> ...;
        false -> ...
    end.
Adam Lindberg
  • 16,447
  • 6
  • 65
  • 85
2

The easiest thing is to consider guards as a part of pattern matching, the part which cannot, or is difficult to, express in the pattern itself. So a guard is a sequence of guard tests and not boolean expressions. The original guard syntax made it easier to see the difference but now they look like boolean expressions, which they are not.

rvirding
  • 20,848
  • 2
  • 37
  • 56