Erlang - Funciones

Erlang es conocido como un lenguaje de programación funcional, por lo tanto, esperaría ver mucho énfasis en cómo funcionan las funciones en Erlang. Este capítulo cubre todo lo que se puede hacer con las funciones en Erlang.

Definición de una función

La sintaxis de una declaración de función es la siguiente:

Sintaxis

FunctionName(Pattern1… PatternN) ->
Body;

Dónde,

  • FunctionName - El nombre de la función es un átomo.

  • Pattern1… PatternN- Cada argumento es un patrón. El número de argumentos N es la aridad de la función. Una función se define de forma única por el nombre del módulo, el nombre de la función y la aridad. Es decir, dos funciones con el mismo nombre y en el mismo módulo, pero con diferentes aridades son dos funciones diferentes.

  • Body - El cuerpo de una cláusula consta de una secuencia de expresiones separadas por coma (,):

El siguiente programa es un ejemplo simple del uso de funciones:

Ejemplo

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

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

Deben tenerse en cuenta las siguientes indicaciones sobre el programa anterior:

  • Estamos definiendo dos funciones, una se llama add que toma 2 parámetros y el otro es el start función.

  • Ambas funciones se definen con la función de exportación. Si no hacemos esto, no podremos usar la función.

  • Una función se puede llamar dentro de otra. Aquí llamamos a la función agregar desde la función de inicio.

La salida del programa anterior será:

Salida

11

Funciones anónimas

Una función anónima es una función que no tiene ningún nombre asociado. Erlang tiene la facilidad de definir funciones anónimas. El siguiente programa es un ejemplo de función anónima.

Ejemplo

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

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

Los siguientes puntos deben tenerse en cuenta sobre el ejemplo anterior:

  • La función anónima se define con la fun() palabra clave.

  • La función se asigna a una variable llamada Fn.

  • La función se llama mediante el nombre de la variable.

La salida del programa anterior será:

Salida

Anonymous Function

Funciones con múltiples argumentos

Las funciones de Erlang se pueden definir con cero o más parámetros. La sobrecarga de funciones también es posible, en la que puede definir una función con el mismo nombre varias veces, siempre que tengan un número diferente de parámetros.

En el siguiente ejemplo, la función de demostración se define con varios argumentos para cada definición de función.

Ejemplo

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

En el programa anterior, estamos definiendo la función de suma dos veces. Pero la definición de la primera función de adición toma dos parámetros y la segunda toma tres parámetros.

La salida del programa anterior será:

Salida

11
17

Funciones con secuencias de guardia

Las funciones en Erlang también tienen la capacidad de tener secuencias de guarda. Estas no son más que expresiones que solo cuando se evalúan como verdaderas harán que la función se ejecute.

La sintaxis de una función con una secuencia de guarda se muestra en el siguiente programa.

Sintaxis

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

Dónde,

  • FunctionName - El nombre de la función es un átomo.

  • Pattern1… PatternN- Cada argumento es un patrón. El número de argumentos N es la aridad de la función. Una función se define de forma única por el nombre del módulo, el nombre de la función y la aridad. Es decir, dos funciones con el mismo nombre y en el mismo módulo, pero con diferentes aridades son dos funciones diferentes.

  • Body - El cuerpo de una cláusula consta de una secuencia de expresiones que están separadas por una coma (,).

  • GuardSeq1 - Ésta es la expresión que se evalúa cuando se llama a la función.

El siguiente programa es un ejemplo simple del uso de una función con una secuencia de guarda.

Ejemplo

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

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

start() -> 
   add(4).

La salida del programa anterior es:

Salida

4

Si la función agregar se llamó como add(3), el programa producirá un error.