Sök…


Introduktion

Låt oss försöka implementera de grundläggande högre orderfunktionerna som karta och minska med Elixir

Karta

Karta är en funktion som tar en matris och en funktion och returnerar en matris efter att ha använt den funktionen på varje element i den listan

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

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

Kopiera klistra in i iex och köra:

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

Kortfattad syntax är MyList.map [1,2,3], &(&1 * 5)

Minska

Minska är en funktion som tar en matris, funktion och ackumulator och använder ackumulator som frö för att starta iterationen med det första elementet för att ge nästa ackumulator och iterationen fortsätter för alla element i arrayen (se nedan exempel)

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

Kopiera klistra in ovanstående kod i iex:

  1. För att lägga till alla siffror i en matris: MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
  2. För att mutliply alla siffror i en matris: MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1

Förklaring till exempel 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)

Filtrera listan med reducera

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow