English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Функции Erlang

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

Определение функции

Грамматика объявления функции такова:

Грамматика

FunctionName(Pattern1… PatternN) ->
Body;

Здесь:

  • FunctionName − Имя функции является атомом (уникальность)

  • Pattern1… PatternN − Каждому параметру соответствует шаблон. Количество параметров N равно количеству параметров функции. Имя функции уникально для модуля, имени функции и количества определяемых параметров. Например, две функции с одинаковым именем в одном и том же модуле, но с разным количеством параметров, также считаются двумя различными функциями.

  • 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 параметров, другая функция — start;

  • Эти функции определены с помощью функции export. Если мы этого не сделаем, то функции не будут использоваться;

  • Функция может быть вызывается в другой функции. В данном случае функция start вызывает функцию add;

Результат выполнения кода -

11

Анонимная функция

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

Пример

-module(helloworld). 
-export([start/0]). 
start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().

Для примера, приведенного выше,应注意 следующие моменты -

  • Анонимные функции определяются с помощью ключевого слова fun()

  • Эта функция назначается переменной с именем Fn

  • Эта функция вызывается по имени переменной

Результат выполнения кода -

Анонимная функция

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

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

Пример кода

-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).

В предыдущем примере программы мы дважды определяем функцию add. Но определение первой функции add использует два параметра, определение второй функции add использует три параметра.

Результат выполнения кода -

11
17

Функция использует последовательность

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

Использование грамматики функции защиты последовательности показано в следующем примере программы.

FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;

Здесь:

  • FunctionName − Имя функции является атомом (уникальность)

  • Pattern1… PatternN − Каждому параметру соответствует шаблон. Количество параметров N равно количеству параметров функции. Имя функции уникально для модуля, имени функции и количества определяемых параметров. Например, две функции с одинаковым именем в одном и том же модуле, но с разным количеством параметров, также считаются двумя различными функциями.

  • Body − Тело подявления состоит из последовательности выражений, разделенных запятыми (,)

  • GuardSeq1 − Когда функция вызывается, она получает выражение для вычисления.

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

Пример кода

-module(helloworld). 
-export([add/1,start/0]). 
add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 
start() -> 
   add(4).

Результат выполнения кода -

4

Если функция add вызывается как add(3), программа покажет ошибку.