Funciones anónimas

Una función anónima es una función aislada que en vez de ser declarada de manera formal (por ejemplo, dentro de un módulo), se declara como una expresión más que podría ser asignada a variables.

Las funciones anónimas en Elixir son una herramienta fundamental para trabajar de forma funcional y compacta. A diferencia de las funciones tradicionales, estas no tienen nombre ni módulo al que pertenezcan, sino que existen como valores que podemos asignar a variables y manipular como cualquier otro dato. Esto las convierte en elementos de primera clase, lo que significa que podemos pasarlas como parámetros, almacenarlas y devolverlas desde otras funciones sin problema.

Para crear una función anónima en Elixir utilizamos la palabra clave fn. A continuación, definimos los argumentos que recibirá la función, separados por comas y sin necesidad de paréntesis. Después, colocamos una flecha -> que indica el inicio del cuerpo de la función, donde escribimos la expresión que queremos evaluar. Finalmente, cerramos la definición con end. Por ejemplo, si queremos una función que eleve al cuadrado un número, la escribiríamos así:

fn n -> n * n end

Esta función toma un argumento n y devuelve su cuadrado. Aunque la sintaxis puede parecer un poco extraña al principio, es bastante clara una vez que nos acostumbramos: transformamos n en n * n.

Cuando definimos una función anónima, Elixir nos muestra algo como #Function<44.97>, que es una representación interna de la función. No nos muestra el resultado directamente porque lo que tenemos es un valor que representa la función, no su ejecución.

Para poder usar esta función, normalmente la asignamos a una variable. Por ejemplo, podemos guardar la función de elevar al cuadrado en la variable cuadrado:

cuadrado = fn n -> n * n end

Ahora, para llamar a esta función almacenada en la variable, no basta con escribir cuadrado(4), porque Elixir interpretaría que estamos llamando a una función global llamada cuadrado con un argumento, y no existe tal función. En su lugar, debemos usar la sintaxis con el punto para indicar que queremos llamar a la función almacenada en la variable:

cuadrado.(4)

Esto devolverá 16, que es el resultado de elevar 4 al cuadrado.

Podemos definir funciones anónimas con varios argumentos sin problema. Por ejemplo, una función que sume dos números:

suma = fn a, b -> a + b end

Y la llamamos con:

suma.(2, 3)

que nos devolverá 5.

Una de las grandes ventajas de las funciones anónimas es que podemos pasarlas como parámetros a otras funciones, lo que facilita la programación funcional y la reutilización de código. Por ejemplo, podemos definir un módulo llamado Calculon con una función operar que recibe otra función como argumento y la aplica a dos valores fijos, 5 y 3:

defmodule Calculon do
  def operar(funcion) do
    funcion.(5, 3)
  end
end

Ahora, podemos llamar a Calculon.operar pasando una función anónima que sume sus dos argumentos:

Calculon.operar(fn a, b -> a + b end)

Esto devolverá 8, porque la función suma 5 y 3.

De igual forma, si definimos una función anónima para restar dos números y la asignamos a la variable restar:

restar = fn a, b -> a - b end

Podemos pasarla a Calculon.operar para obtener la diferencia:

Calculon.operar(restar)

que devolverá 2.

Así, las funciones anónimas nos permiten escribir código más flexible y expresivo, facilitando la composición y el paso de comportamiento como datos dentro de nuestros programas en Elixir.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos