Pierwszy bonus bo mam na to czas ;) szybko i sprawnie. Dzisiaj pisałem o funkcjach wyższego rzędu, czyli funkcjach które przyjmują jako parametr funkcję lub funkcję zwracają.

W Elixir mamy wiele takich funkcji jedną z nich jest Enum.map czy, która przyjmuje funkcję jako parametr. Wygląda to mniej więcej tak:

Enum.map([1, 2], fn x -> x * 2 end)

Ggdzie pierwszym parametrem jest lista elementów, drugim zaś wyrażenie lambda przekazane jako funkcja anonimowa do map. Funkcja ta pomnoży każdy element listy przez dwa.

Można to też inaczej zapisać.

by2 = fn x -> x *2 end
Enum.map([1, 2], by2)

Można to jeszcze zapisać tak:

by2a = &(&1 * 2)
Enum.map([1, 2], by2a)

Operator & to nic innego jak capture operator o którym już wspominałem. Ogólnie umożliwia on nam tworzenie funkcji anonimowych jak i pojmowanie innych funkcji, czyli to z mnożeniem, możemy zapisać na przykład tak:

by2b = &Kernel.*(&1, 2)
Enum.map([1, 2], by2b)

Gdzie &1 (itp. numeryczne) to tak naprawdę wstawki, które umożliwiają podstawianie wartości pod dany parametr. Czyli:

# zwróci 2
by2b.(1)
# zwróci 4
by2a.(2)

Po stronie metody przyjmowanie zaś funkcji jest dość proste:

def firstOrder(fun) do
    fun.()
end

jak funkcja ma parametr to przekazujemy parametr w nawiasie.

Zwracanie funkcji – patrz bundowanie funkcji do aliasu pokazane wyżej. Działa tak samo.

To tyle na krótki Bonus elixirowy :)