2015-11-03 21 views
16

我目前的解決方案是在陣列上運行with_index,然後運行reduce如何在Elixir中使用索引來減少?

5..10 
|> Stream.with_index 
|> Enum.reduce(0, fn(num_idx, acc) -> 
    {num, idx} = num_idx 
    acc + num * idx 
    end) 

是否有一種方法將元素的索引附加到元素上,然後在數組上運行reduce?

+0

你所嘗試的是完美的,你還在尋找什麼? – coderVishal

+0

@coderVishal是的,我想它已經儘可能簡單了。 – domp

+0

聽起來像你想要的東西一樣的Enumerable.each_with_index在Ruby – cuonglm

回答

12

您必須記住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) 
9

你可以直接做模式匹配參數列表中:

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 
+0

啊這是正確的,我忘記了模式匹配裏面的參數列表, 謝謝! – domp

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中模式匹配的元組對列表。