我目前的解決方案是在陣列上運行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?
我目前的解決方案是在陣列上運行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?
您必須記住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)
你可以直接做模式匹配參數列表中:
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
啊這是正確的,我忘記了模式匹配裏面的參數列表, 謝謝! – domp
爲什麼不使用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
中模式匹配的元組對列表。
你所嘗試的是完美的,你還在尋找什麼? – coderVishal
@coderVishal是的,我想它已經儘可能簡單了。 – domp
聽起來像你想要的東西一樣的Enumerable.each_with_index在Ruby – cuonglm