Funs используются для определения анонимных функций в Erlang. Общий синтаксис анонимной функции приведен ниже —
Синтаксис
F = fun (Arg1, Arg2, ... ArgN) -> ... End
куда
-
F — это имя переменной, назначенной анонимной функции.
-
Arg1, Arg2, … ArgN — это аргументы, которые передаются анонимной функции.
F — это имя переменной, назначенной анонимной функции.
Arg1, Arg2, … ArgN — это аргументы, которые передаются анонимной функции.
В следующем примере показано, как можно использовать анонимную функцию.
пример
-module(helloworld). -export([start/0]). start() -> A = fun() -> io:fwrite("Hello") end, A().
Следующие вещи необходимо отметить о вышеупомянутой программе.
-
Анонимная функция назначается переменной A.
-
Анонимная функция через переменную A ().
Анонимная функция назначается переменной A.
Анонимная функция через переменную A ().
Когда мы запустим вышеуказанную программу, мы получим следующий результат.
“Hello”
Другой пример анонимной функции заключается в следующем, но это с использованием параметров.
-module(helloworld). -export([start/0]). start() -> A = fun(X) -> io:fwrite("~p~n",[X]) end, A(5).
Когда мы запустим вышеуказанную программу, мы получим следующий результат.
Выход
5
Использование переменных
Функция Anonymous имеет возможность доступа к переменным, которые находятся за пределами области действия анонимной функции. Давайте посмотрим на пример этого —
пример
-module(helloworld). -export([start/0]). start() -> B = 6, A = fun(X) -> io:fwrite("~p~n",[X]), io:fwrite("~p~n",[B]) end, A(5).
Следующие вещи необходимо отметить о вышеупомянутой программе.
-
Переменная B находится вне области действия анонимной функции.
-
Анонимная функция все еще может обращаться к переменной, определенной в глобальной области видимости.
Переменная B находится вне области действия анонимной функции.
Анонимная функция все еще может обращаться к переменной, определенной в глобальной области видимости.
Когда мы запустим вышеуказанную программу, мы получим следующий результат.
Выход
5 6
Функции внутри функций
Одним из других наиболее мощных аспектов функций более высокого порядка является то, что вы можете определить функцию внутри функции. Давайте посмотрим пример того, как мы можем достичь этого.
пример
-module(helloworld). -export([start/0]). start() -> Adder = fun(X) -> fun(Y) -> io:fwrite("~p~n",[X + Y]) end end, A = Adder(6), A(10).
Следующие вещи необходимо отметить о вышеупомянутой программе.
-
Adder — функция высшего порядка, определенная как fun (X).
-
Функция Adder fun (X) имеет ссылку на другую функцию fun (Y).
Adder — функция высшего порядка, определенная как fun (X).
Функция Adder fun (X) имеет ссылку на другую функцию fun (Y).
Когда мы запустим вышеуказанную программу, мы получим следующий результат.