Поиск…


Вступление

Попробуем реализовать основные функции более высоких заказов, такие как карта и уменьшить с помощью Elixir

карта

Карта - это функция, которая будет принимать массив и функцию и возвращать массив после применения этой функции к каждому элементу в этом списке

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

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

Скопируйте пасту в iex и выполните:

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

Синтаксис Shorthand - MyList.map [1,2,3], &(&1 * 5)

уменьшить

Сокращение - это функция, которая будет принимать массив, функцию и аккумулятор и использовать накопитель в качестве семени для запуска итерации с первым элементом, чтобы дать следующий аккумулятор, и итерация продолжается для всех элементов в массиве (см. Ниже пример)

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

Скопируйте вставку вышеприведенного фрагмента в iex:

  1. Чтобы добавить все числа в массив: MyList.reduce [1,2,3,4], fn acc, element -> acc + element end, 0
  2. Чтобы скорректировать все числа в массиве: MyList.reduce [1,2,3,4], fn acc, element -> acc * element end, 1

Объяснение, например, 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)

Отфильтруйте список, используя

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow