As funções anónimas são muito usadas em todo o Elixir, por si só, como valores devolvidos e como argumentos em funções de ordem superior como Enum.map/2:
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
Em Elixir, as funções são tratadas como cidadãos de primeira classe:
As funções anónimas criam-se com a palavra-chave fn e são invocadas com um ponto (.):
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
As funções anónimas também podem ser criadas com a forma abreviada de captura &.
O & inicial marca o início da expressão de captura.
&1, &2 e assim por diante referem-se aos argumentos posicionais da função anónima.
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
O operador de captura & também pode ser usado para capturar uma função nomeada existente:
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Em Elixir, as funções anónimas são closures. Conseguem aceder a variáveis que estão no âmbito quando a função é definida. As variáveis atribuídas dentro de uma função anónima não são acessíveis fora dela:
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0