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:

  1. Pour ajouter tous les nombres dans un tableau: MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
  2. 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, []


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow