如何减少Elixir中的索引?

dom*_*omp 19 elixir

我目前的解决方案是运行with_index然后reduce在阵列上运行.

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

是否有方法将元素的索引附加到元素,然后在数组上运行reduce?

cod*_*hal 17

您必须记住该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)
Run Code Online (Sandbox Code Playgroud)


Fom*_*tia 12

为什么不用Enum.with_index

5..10
|> Enum.with_index
|> Enum.reduce(0, fn({number, index}, acc) ->
     acc + number * index
   end)
Run Code Online (Sandbox Code Playgroud)

.with_index获取一个枚举并返回一个关键字列表,其中枚举的每个元素都映射到其索引.所以Enum.with_index([:hi, :hello, :greetings])会回来[hi: 0, hello: 1, greetings: 2].我们可以利用Elixir关键字列表是模式匹配的元组对列表这一事实.reduce.


Pat*_*ity 9

您可以直接在参数列表中进行模式匹配:

5..10 
|> Stream.with_index 
|> Enum.reduce(0, fn({num, idx}, acc) ->
     acc + num * idx
   end)
Run Code Online (Sandbox Code Playgroud)

另一种选择是首先通过产品获得产品Stream.map,然后Enum.sum在最后使用:

5..10 
|> Stream.with_index 
|> Stream.map(fn {num, idx} -> num * idx end)
|> Enum.sum
Run Code Online (Sandbox Code Playgroud)