Sometimes a function needs to behave differently depending on its inputs. Consider calculating the absolute value of a number: if the number is less than zero, you multiply by -1; if it’s zero or greater, you return it unchanged.

In Erlang, you handle this with predicate guards – conditions on the inputs defined right after the argument list:
-module(maths).
-export([abs/1]).
abs(X) when X < 0 -> -1 * X;
abs(X) -> X.
The when X < 0 part is the guard. If it evaluates to true, that clause matches. Otherwise, Erlang falls through to the next clause – which in this case has no guard and matches everything.
Erlang already provides a built-in abs function in its math module, of course. This is just a simple illustration of how guards work – and the reason my module is called maths instead of math. Naming collisions: the eternal struggle.