Операции 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