Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make the equivalent of a C-style if-else statement in Erlang?

How do I make the equivalent of a C-style if-else in Erlang?

 if(a == b) {
   expression1
 } else {
   expression2 
 }
like image 293
Abhimanyu Avatar asked Jun 08 '09 08:06

Abhimanyu


4 Answers

if     a == b ->         expr1;     true ->         exprElse end 

There is no real else in Erlang, you just match with true. More information at the Erlang documentation.

You have to pay close attention to the ';' terminator :

if     a == b ->         clauseN,         expr1;     cond2 ->         clause1,         clause2,         expr2;     cond3 ->         expr3;     true ->         exprElse end  

It's not a copy-paste friendly language.

like image 127
Raoul Supercopter Avatar answered Sep 22 '22 18:09

Raoul Supercopter


Pattern matching is one of Erlangs many strengths and it can often be used instead of if statements. It is often more readable to pattern match on function arguments or use a case expression (which also is pattern matching).

Suppose you have a function some_function which takes two arguments. If the arguments are equal you evaluate expression1, otherwise you evaluate expression2. This can be expressed in erlang as:

some_function(A, A) -> expression1; some_function(A, B) -> expression2. 

It is quite amazing how much you can achieve with this kind of simple pattern matching. With guard clauses you can express more complicated patterns, e.g.,

some_function(A, B) when A < B -> expression3.  

Another possibility is to use a case .. of expression. Your particular example would translate to

case a == b of     true -> expression1;     false -> expression2 end. 

(In this case expression2 would always be evaluated since a and b are atoms and never equal to each other. Variables in Erlang are upper case.)

You can read more about Erlang expressions here.

like image 42
Jonas Avatar answered Sep 23 '22 18:09

Jonas


if
    A =:= B ->
        expr1;
    true ->
        expr2
end 

or

case A =:= B of
    true -> expr1;
    false -> expr2
end

or

case A of
    B -> expr1;
    _ -> expr2
end

or

  foo(A,B), ...

...
foo(X,X) -> expr1;
foo(_,_) -> expr2.
like image 33
Hynek -Pichi- Vychodil Avatar answered Sep 21 '22 18:09

Hynek -Pichi- Vychodil


Another option:

case a of
    b -> expr1;  %% true
    _ -> expr2   %% false
end.
like image 40
marcc Avatar answered Sep 24 '22 18:09

marcc