Как сделать сокращение с помощью индекса в 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.