Suche…


Einführung

Versuchen wir, die grundlegenden Funktionen höherer Ordnung, wie z. B. Zuordnen und Reduzieren, mit Elixir zu implementieren

Karte

Map ist eine Funktion, die ein Array und eine Funktion übernimmt und ein Array zurückgibt, nachdem diese Funktion auf jedes Element in dieser Liste angewendet wurde

defmodule MyList do
  def map([], _func) do
    []
  end

  def map([head | tail], func) do
    [func.(head) | map(tail, func)]
  end
end

Einfügen in iex und Ausführen:

MyList.map [1,2,3], fn a -> a * 5 end

MyList.map [1,2,3], &(&1 * 5) ist MyList.map [1,2,3], &(&1 * 5)

Reduzieren

Reduce ist eine Funktion, die ein Array, eine Funktion und einen Akkumulator benötigt und einen Akkumulator als Startwert verwendet, um die Iteration mit dem ersten Element zu starten, um den nächsten Akkumulator zu erhalten, und die Iteration wird für alle Elemente im Array fortgesetzt (siehe Beispiel unten).

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

Kopieren Sie den obigen Ausschnitt in iex:

  1. Um alle Zahlen in einem Array MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0 : MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
  2. Um alle Zahlen in einem Array zu 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

Erklärung für Beispiel 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)

Filtern Sie die Liste mit verkleinern

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow