Uma breve motivação
"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
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
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
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