Как сделать сокращение с помощью индекса в Elixir?
Мое текущее решение - запустить with_index
, а затем reduce
в массиве.
5..10
|> Stream.with_index
|> Enum.reduce(0, fn(num_idx, acc) ->
{num, idx} = num_idx
acc + num * idx
end)
Есть ли метод, который прикрепляет элемент к элементу, а затем запускает сокращение в массиве?
Ответы
Ответ 1
Вы должны помнить, что функция Enum.reduce
должна иметь два аргумента. Поэтому вам необходимо внести соответствующие изменения.
То, что вы сделали, было прекрасно. В соответствии с вашей спецификацией вы также можете использовать Enum.with_index
В качестве альтернативы вы можете использовать аккумулятор как кортеж, с одним элементом, представляющим индекс, и другим результатом.
5..10 #Directly pattern match in argument list
|> Enum.reduce({0,0}, fn(num,{index,current_result}) ->
{index+1,current_result + num * index}
end)
Ответ 2
Вы можете выполнить сопоставление шаблонов непосредственно внутри списка аргументов:
5..10
|> Stream.with_index
|> Enum.reduce(0, fn({num, idx}, acc) ->
acc + num * idx
end)
Другой вариант - сначала получить продукты через Stream.map
, а затем использовать Enum.sum
в конце:
5..10
|> Stream.with_index
|> Stream.map(fn {num, idx} -> num * idx end)
|> Enum.sum
Ответ 3
Почему бы не использовать Enum.with_index
?
5..10
|> Enum.with_index
|> Enum.reduce(0, fn({number, index}, acc) ->
acc + number * index
end)
.with_index
берет перечислимый и возвращает список ключевых слов с каждым элементом перечислимого, сопоставленным с его индексом. Поэтому Enum.with_index([:hi, :hello, :greetings])
вернет [hi: 0, hello: 1, greetings: 2]
. Мы можем использовать тот факт, что списки ключевых слов Elixir представляют собой списки пар кортежей в соответствие шаблону в .reduce
.