I am not sure I understand why we have them. For instance I can take the following code<br><pre>is_greater_than(X, Y) ->
    if
        X>Y ->
            true;
        true -> % works as an 'else' branch
            false
    end.</pre>And make it<br><pre>is_true(true) -><br>    true;<br>is_true(false) -><br>    false.<br><br>is_greater_than(X, Y) ->
    is_true(X>Y).</pre>I can do the same thing with case statements<br><pre>is_valid_signal(Signal) ->
    case Signal of
        {signal, _What, _From, _To} ->
            true;
        {signal, _What, _To} ->
            true;
        _Else ->
            false
    end.<br></pre>Becomes<br><pre>switch_signal({signal, _What, _From, _To}) -><br>    true;<br>switch_signal({signal, _What, _To}) -><br>    true;<br>switch_signal(_Else) -><br>    false.<br><br>is_valid_signal(Signal) ->
    switch_signal(Signal).</pre><br>I know that the control structures are a little bit faster, not much, but I find that the function form is more readable. <br>