Erlang известен как функциональный язык программирования, поэтому вы ожидаете увидеть много внимания тому, как функции работают в Erlang. В этой главе рассказывается, что можно сделать с помощью функций в Erlang.
Определение функции
Синтаксис объявления функции следующий:
Синтаксис
FunctionName(Pattern1… PatternN) -> Body;
Куда,
-
FunctionName — имя функции является атомом.
-
Pattern1… PatternN — каждый аргумент является шаблоном. Число аргументов N является арностью функции. Функция однозначно определяется именем модуля, именем функции и арностью. То есть две функции с одинаковым именем и в одном и том же модуле, но с разными арностями — это две разные функции.
-
Тело. Тело предложения состоит из последовательности выражений, разделенных запятой (,):
FunctionName — имя функции является атомом.
Pattern1… PatternN — каждый аргумент является шаблоном. Число аргументов N является арностью функции. Функция однозначно определяется именем модуля, именем функции и арностью. То есть две функции с одинаковым именем и в одном и том же модуле, но с разными арностями — это две разные функции.
Тело. Тело предложения состоит из последовательности выражений, разделенных запятой (,):
Следующая программа представляет собой простой пример использования функций —
пример
-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 .
-
Обе функции определены с помощью функции экспорта. Если мы этого не сделаем, мы не сможем использовать эту функцию.
-
Одна функция может быть вызвана внутри другой. Здесь мы вызываем функцию добавления из функции запуска.
Мы определяем две функции, одна называется add, которая принимает 2 параметра, а другая является функцией start .
Обе функции определены с помощью функции экспорта. Если мы этого не сделаем, мы не сможем использовать эту функцию.
Одна функция может быть вызвана внутри другой. Здесь мы вызываем функцию добавления из функции запуска.
Выход вышеупомянутой программы будет —
Выход
11
Анонимные функции
Анонимная функция — это функция, с которой не связано имя. Erlang имеет возможность определять анонимные функции. Следующая программа является примером анонимной функции.
пример
-module(helloworld). -export([start/0]). start() -> Fn = fun() -> io:fwrite("Anonymous Function") end, Fn().
Следующие пункты должны быть отмечены о приведенном выше примере —
-
Анонимная функция определяется с помощью ключевого слова fun () .
-
Функция назначена переменной с именем Fn.
-
Функция вызывается через имя переменной.
Анонимная функция определяется с помощью ключевого слова fun () .
Функция назначена переменной с именем Fn.
Функция вызывается через имя переменной.
Выход вышеупомянутой программы будет —
Выход
Anonymous Function
Функции с несколькими аргументами
Функции Эрланга могут быть определены с нулем или более параметров. Возможна также перегрузка функции, при которой вы можете определить функцию с одним и тем же именем несколько раз, если они имеют разное количество параметров.
В следующем примере демонстрация функции определяется с несколькими аргументами для каждого определения функции.
пример
-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).
В приведенной выше программе мы определяем функцию добавления дважды. Но определение первой функции добавления принимает два параметра, а второй — три параметра.
Выход вышеупомянутой программы будет —
Выход
11 17
Функции с защитными последовательностями
Функции в Erlang также могут иметь защитные последовательности. Это не что иное, как выражения, которые только при значении true будут запускать функцию.
Синтаксис функции с защитной последовательностью показан в следующей программе.
Синтаксис
FunctionName(Pattern1… PatternN) [when GuardSeq1]-> Body;
Куда,
-
FunctionName — имя функции является атомом.
-
Pattern1… PatternN — каждый аргумент является шаблоном. Число аргументов N является арностью функции. Функция однозначно определяется именем модуля, именем функции и арностью. То есть две функции с одинаковым именем и в одном и том же модуле, но с разными арностями — это две разные функции.
-
Тело. Тело предложения состоит из последовательности выражений, разделенных запятой (,).
-
GuardSeq1 — это выражение, которое вычисляется при вызове функции.
FunctionName — имя функции является атомом.
Pattern1… PatternN — каждый аргумент является шаблоном. Число аргументов N является арностью функции. Функция однозначно определяется именем модуля, именем функции и арностью. То есть две функции с одинаковым именем и в одном и том же модуле, но с разными арностями — это две разные функции.
Тело. Тело предложения состоит из последовательности выражений, разделенных запятой (,).
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) , программа выдаст ошибку.