Unetway

Erlang - Функции

Эрланг известен как функциональный язык программирования, поэтому вы ожидаете увидеть большой акцент на том, как работают функции в Erlang. В этой главе описывается, что можно сделать с помощью функций в Erlang.

Синтаксис объявления функции выглядит следующим образом:

FunctionName(Pattern1… PatternN) ->
Body;
  • FunctionName - имя функции - это атом.
  • Pattern1 ... PatternN - Каждый аргумент является шаблоном. Число аргументов N - это арность функции. Функция уникально определяется именем модуля, именем функции и arity. То есть две функции с одним и тем же именем и в одном модуле, но с разными уровнями - две разные функции.
  • Body - состоит из последовательности выражений, разделенных запятой (,):

Следующая программа представляет собой простой пример использования функций:

-module(helloworld). 
-export([add/2,start/0]). 

add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
start() -> 
   add(5,6).

Следует отметить следующие указатели относительно вышеуказанной программы -

  • Мы определяем две функции: один называется add, который принимает 2 параметра, а другой - функцию начала 
  • Обе функции определяются с помощью функции экспорта. Если мы этого не сделаем, мы не сможем использовать эту функцию
  • Одна функция может быть вызвана внутри другой. Здесь мы вызываем функцию add из функции start

Анонимные функции

Анонимная функция - это функция, у которой нет имени, связанного с ней. У Erlang есть возможность определять анонимные функции. Следующая программа является примером анонимной функции.

-module(helloworld). 
-export([start/0]). 

start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().

Необходимо отметить следующие моменты в приведенном выше примере.

  • Анонимная функция определяется ключевым словом fun ()
  • Функция назначается переменной Fn.
  • Функция вызывается через имя переменной.

Функции с несколькими аргументами

Функции Erlang могут быть определены с нулевым или большим количеством параметров. Также возможна перегрузка функций, в которой вы можете определить функцию с тем же именем несколько раз, если у них есть различное количество параметров.

-module(helloworld). 
-export([add/2,add/3,start/0]). 

add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
add(X,Y,Z) -> 
   A = X+Y+Z, 
   io:fwrite("~w~n",[A]). 
 
start() ->
   add(5,6), 
   add(5,6,6).

В приведенной выше программе мы дважды определяем функцию добавления. Но определение первой функции добавления принимает два параметра, а второе принимает три параметра.

Функции с охранными последовательностями

Функции в Erlang также могут иметь защитные последовательности. Это не что иное, как выражения, которые только при оценке на true вызовут функцию. Синтаксис функции с защитной последовательностью показан в следующей программе.

FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;
  • FunctionName - имя функции - это атом.
  • Pattern1 ... PatternN - Каждый аргумент является шаблоном. Число аргументов N - это арность функции. Функция уникально определяется именем модуля, именем функции и arity. То есть две функции с одним и тем же именем и в одном модуле, но с разными уровнями - две разные функции.
  • Body - предложения - состоит из последовательности выражений, разделенных запятой (,).
  • GuardSeq1 - это выражение, которое оценивается при вызове функции.

Следующая программа представляет собой простой пример использования функции с защитной последовательностью.

-module(helloworld). 
-export([add/1,start/0]). 

add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 

start() -> 
   add(4).