Elixir Language
Functioneel programmeren in Elixir
Zoeken…
Invoering
Laten we proberen de basisfuncties van hogere orders zoals map te implementeren en te verminderen met behulp van Elixir
Kaart
Map is een functie die een array en een functie gebruikt en een array retourneert na het toepassen van die functie op elk element in die lijst
defmodule MyList do
def map([], _func) do
[]
end
def map([head | tail], func) do
[func.(head) | map(tail, func)]
end
end
Kopieer en plak in iex
en voer uit:
MyList.map [1,2,3], fn a -> a * 5 end
De MyList.map [1,2,3], &(&1 * 5)
syntaxis is MyList.map [1,2,3], &(&1 * 5)
Verminderen
Verkleinen is een functie die een array, functie en accumulator gebruikt en accumulator als seed gebruikt om de iteratie met het eerste element te starten om de volgende accumulator te geven en de iteratie gaat door voor alle elementen in de array (zie onderstaand voorbeeld)
defmodule MyList do
def reduce([], _func, acc) do
acc
end
def reduce([head | tail], func, acc) do
reduce(tail, func, func.(acc, head))
end
end
Kopieer en plak het bovenstaande fragment in iex:
- Alle getallen in een array toevoegen:
MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
- Om alle getallen in een array opnieuw samen te
MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1
:MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1
Uitleg bijvoorbeeld 1:
Iteration 1 => acc = 0, element = 1 ==> 0 + 1 ===> 1 = next accumulator
Iteration 2 => acc = 1, element = 2 ==> 1 + 2 ===> 3 = next accumulator
Iteration 3 => acc = 3, element = 3 ==> 3 + 3 ===> 6 = next accumulator
Iteration 4 => acc = 6, element = 4 ==> 6 + 4 ===> 10 = next accumulator = result(as all elements are done)
Filter de lijst met verkleinen
MyList.reduce [1,2,3,4], fn acc, element -> if rem(element,2) == 0 do acc else acc ++ [element] end end, []