Elixir Language
Programmation fonctionnelle dans Elixir
Recherche…
Introduction
Essayons d'implémenter les fonctions de base des ordres supérieurs comme la carte et de réduire l'utilisation d'Elixir
Carte
Map est une fonction qui prend un tableau et une fonction et retourne un tableau après avoir appliqué cette fonction à chaque élément de cette liste.
defmodule MyList do
def map([], _func) do
[]
end
def map([head | tail], func) do
[func.(head) | map(tail, func)]
end
end
Copier coller dans iex
et exécuter:
MyList.map [1,2,3], fn a -> a * 5 end
La syntaxe MyList.map [1,2,3], &(&1 * 5)
est MyList.map [1,2,3], &(&1 * 5)
Réduire
Reduce est une fonction qui prend un tableau, une fonction et un accumulateur et utilise l' accumulateur comme graine pour démarrer l'itération avec le premier élément pour donner le prochain accumulateur et l'itération se poursuit pour tous les éléments du tableau (voir l'exemple ci-dessous)
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
Copiez le code ci-dessus dans iex:
- Pour ajouter tous les nombres dans un tableau:
MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
- Pour multiplier tous les nombres d'un tableau:
MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1
Explication par exemple 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)
Filtrer la liste en utilisant réduire
MyList.reduce [1,2,3,4], fn acc, element -> if rem(element,2) == 0 do acc else acc ++ [element] end end, []