Erlang - Diversiones

Las diversiones se utilizan para definir funciones anónimas en Erlang. La sintaxis general de una función anónima se da a continuación:

Sintaxis

F = fun (Arg1, Arg2, ... ArgN) ->
   ...
End

Dónde

  • F - Este es el nombre de variable asignado a la función anónima.

  • Arg1, Arg2, ... ArgN - Estos son los argumentos que se pasan a la función anónima.

El siguiente ejemplo muestra cómo se puede utilizar la función anónima.

Ejemplo

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

start() -> 
   A = fun() -> io:fwrite("Hello") end, 
   A().

Se deben tener en cuenta las siguientes cosas sobre el programa anterior.

  • La función anónima se asigna a la variable A.

  • La función anónima a través de la variable A ().

Cuando ejecutamos el programa anterior obtendremos el siguiente resultado.

“Hello”

Otro ejemplo de función anónima es el siguiente, pero esto es con el uso de parámetros.

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

start() -> 
   A = fun(X) -> 
      io:fwrite("~p~n",[X]) 
      end, 
   A(5).

Cuando ejecutamos el programa anterior obtendremos el siguiente resultado.

Salida

5

Usando Variables

La función Anónima tiene la capacidad de acceder a las variables que están fuera del alcance de la función anónima. Veamos un ejemplo de esto:

Ejemplo

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

start() -> 
   B = 6, 
   A = fun(X) -> 
      io:fwrite("~p~n",[X]), 
      io:fwrite("~p~n",[B]) 
      end, 
   A(5).

Se deben tener en cuenta las siguientes cosas sobre el programa anterior.

  • La variable B está fuera del alcance de la función anónima.

  • La función anónima aún puede acceder a la variable definida en el ámbito global.

Cuando ejecutamos el programa anterior obtendremos el siguiente resultado.

Salida

5
6

Funciones dentro de funciones

Uno de los otros aspectos más poderosos de las funciones de orden superior es que puede definir una función dentro de una función. Veamos un ejemplo de cómo podemos lograrlo.

Ejemplo

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

start() -> 
   Adder = fun(X) -> fun(Y) -> io:fwrite("~p~n",[X + Y]) end end, 
   A = Adder(6), 
   A(10).

Se deben tener en cuenta las siguientes cosas sobre el programa anterior.

  • Sumador es una función de orden superior definida como diversión (X).

  • La función de sumador fun (X) tiene una referencia a otra función fun (Y).

Cuando ejecutamos el programa anterior obtendremos el siguiente resultado.

Salida

16