Операции if/then/else
Напишем несложную функцию, находящую максимальный элемент массива:
-module(test).
-export([list_max/1]).
list_max([]) -> [];
list_max([Head | Rest]) -> list_max(Head, Rest).
list_max(Head, []) -> Head;
list_max(Head, [NewHead | List]) ->
if
Head > NewHead -> list_max(Head, List);
true -> list_max(NewHead, List)
end.
1> c(test.erl).
{ok,test}
2> test:list_max([1,2,3,4,5]).
5
Первое, на что стоит обратить – аналог оператора else отсутствует, вместо этого true -> “что-то там”. В остальном более-менее привычно, за исключением того что все время приходится мыслить “рекурсивно”. На самом деле, операторы if/then/else/case изначально отсутствовали в языке, все это можно делать при помощи pattern matching, что кстати говоря и считается, более правильным. Вот, тот же пример, иллюстрирующий этот подход:
-module(test). -export([list_max/1]). list_max([]) -> []; list_max([Head | Rest]) -> list_max(Rest, Head). list_max([], MaxValue) -> MaxValue; list_max([Head | Rest], MaxValue) when Head > MaxValue -> list_max(Rest, Head); list_max([Head | Rest], MaxValue) -> list_max(Rest, MaxValue).
Оператор case
А вот пример того как работает case в erlang:
-module(days).
-export([day_of_week/1]).
day_of_week(Day) ->
case Day of
0 -> monday;
1 -> tuesday;
2 -> wednesday;
3 -> thursday;
4 -> friday;
5 -> saturday;
6 -> sunday
end.
1> c(days.erl).
{ok,days}
2> days:day_of_week(1).
tuesday