我目前的解决方案是在阵列上运行with_index
然后reduce
。
5..10
|> Stream.with_index
|> Enum.reduce(0, fn(num_idx, acc) ->
{num, idx} = num_idx
acc + num * idx
end)
是否有方法将元素的索引附加到元素,然后在数组上运行reduce?
答案 0 :(得分:16)
您必须记住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)
答案 1 :(得分:11)
为什么不使用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
中模式匹配的元组对列表这一事实。
答案 2 :(得分: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