Funcional em Elixir

Uma breve motivação

Paradigma Funcional

"Seja f uma função, f: R -> R, tal que..."

Lembra disso?

conj. A

f

conj. B

def f(element_a) do
  # ...
  element_b
end

a = pick_from_A()

b = f(a)

# b in B

a

b

Paradigma Funcional

O que acontece com a depois de aplicar a função f ?

Ele deixa de valer a?

conj. A

f

conj. B

a = pick_from_A()
a_copy = a

b = f(a)

a == a_copy # true

a

b

a continua sendo a

f não tem efeitos colaterais

Paradigma Funcional

defmodule Example do
  def run_one do
    IO.puts "Example One"
    in_fahr = %{ scale: :fahr, temp: 40 }
    in_cels = fahr_to_cels(in_fahr)
        
    IO.inspect(in_fahr)
    IO.inspect(in_cels)
  end
    
  defp fahr_to_cels(data) do
    Map.update(
      Map.update(data, :temp, 0, fn f -> (f - 32) / 1.8 end),
      :scale, :cels, fn _s -> :cels end
    )
  end
end

Example.run_one

Paradigma Funcional

defmodule Example do
  def run_two do
    IO.puts "Example Two"
    in_cels = %{ scale: :cels, temp: 40 }
    in_fahr = cels_to_fahr(in_cels)
        
    IO.inspect(in_cels)
    IO.inspect(in_fahr)
  end
    
  defp cels_to_fahr(data) do
    # alternative syntax
    data
    |> Map.update(:temp, 0, fn c -> c * 1.8 + 32 end)
    |> Map.update(:scale, :fahr, fn _s -> :fahr end)
  end
end

Example.run_two
Made with Slides.com