Elixir Language
Funktionell programmering i Elixir
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:
- För att lägga till alla siffror i en matris:
MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
- 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