Erlang. Операции if/then/else/case.

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

Comments

comments


Bookmark and Share