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
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
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
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
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
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
OK, mas isto é assunto para outros posts.
Top comments (0)