DEV Community

Elixir UTFPR (por Adolfo Neto)
Elixir UTFPR (por Adolfo Neto)

Posted on • Edited on

Funções em Elixir como associações de valores ou como "receitas"

Olá, neste texto vou falar um pouco sobre funções. Em primeiro lugar deixo aqui uma lista de vídeos de um colega professor da UTFPR, Helio Tozatti, sobre teoria dos conjuntos e conjuntos numéricos. Acho bom revisar os conceitos básicos de matemática para entender alguns conceitos de programação funcional. É essencial? Não sei. Talvez não.

Neste texto usarei funções anônimas pois elas podem ser definidas de forma mais elegante no shell de Elixir, o iex (Elixir Interativo).

Vou começar definindo uma função entre dois conjuntos, A e B, f: A -> B.

Sejam A = {:a, :b, :c} e B = {2, 4}.

Seja f tal que:

  • f(:a) = 2
  • f(:b) = 4
  • f(:c) = 2

Eu defino f em Elixir da seguinte forma:

f = fn :a -> 2; :b -> 4; :c -> 2 end
Enter fullscreen mode Exit fullscreen mode

Como eu verifico se a função anônima que defini, e que associei à variável f, está correta?

> f.(:a)
2
> f.(:b)
4
> f.(:c)
2
Enter fullscreen mode Exit fullscreen mode

Observe que entre o nome da variável e os parênteses que listam os argumentos precisamos colocar um PONTO (.).

Esta forma de definir funções, que chamo de "função como associações de valores" é permitida em matemática e em Elixir, mas pouco utilizada.

Em Elixir faria mais sentido criar um mapa para isso:

> map = %{:a => 2, :b => 4, :c => 2}       
%{a: 2, b: 4, c: 2}
> map[:a]
2
Enter fullscreen mode Exit fullscreen mode

Além de obter, na prática, o mesmo resultado, é mais flexível, pois mapas podem ser modificados (considerando-se a imutabilidade, claro).

Logo, funções em Elixir são geralmente "receitas". Um exemplo básico é uma função que calcula o dobro de um número:

> dobro = fn x -> 2*x end
#Function<44.79398840/1 in :erl_eval.expr/5>
> dobro.(2)
4
Enter fullscreen mode Exit fullscreen mode

E, claro, você pode ter "receitas" que envolvem mais "ingredientes" (parâmetros). Eu gosto do exemplo do cálculo do Índice de Massa Corpórea, onde dados como entrada o peso de uma pessoa (em quilogramas) e a altura (em metros), calcula-se um valor que fica na faixa de 15 a 40 (às vezes mais):

> imc = fn peso, altura -> peso/(altura*altura) end
#Function<43.79398840/2 in :erl_eval.expr/5>
> imc.(80, 1.7)
27.68166089965398
Enter fullscreen mode Exit fullscreen mode

Claro que estes exemplos são muito simples. Podemos ter funções bem mais elaboradas em Elixir; até mesmo funções que não são funções matemáticas:

> Enum.random(1000..2000)
1771
> Enum.random(1000..2000)
1988
Enter fullscreen mode Exit fullscreen mode

OK, mas isto é assunto para outros posts.

Top comments (0)