私の現在の解決策は、配列でwith_index
を実行してから、reduce
を実行することです。
5..10
|> Stream.with_index
|> Enum.reduce(0, fn(num_idx, acc) ->
{num, idx} = num_idx
acc + num * idx
end)
要素のインデックスを要素にアタッチしてから、配列に対してreduceを実行するメソッドはありますか?
Enum.reduce
関数には2つの引数が必要であることを覚えておく必要があります。したがって、それに応じて変更を加える必要があります。
あなたがしたことは完全に大丈夫でした。仕様に応じて、Enum.with_index
を使用することもできます
または、アキュムレータをタプルとして使用し、1つの要素がインデックスを表し、他の要素が結果を表すこともできます。
5..10 #Directly pattern match in argument list
|> Enum.reduce({0,0}, fn(num,{index,current_result}) ->
{index+1,current_result + num * index}
end)
_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
_でパターンマッチングを行うことができます。
引数リスト内で直接パターンマッチングを行うことができます。
5..10
|> Stream.with_index
|> Enum.reduce(0, fn({num, idx}, acc) ->
acc + num * idx
end)
もう1つのオプションは、最初にStream.map
を介して製品を取得し、最後にEnum.sum
を使用することです。
5..10
|> Stream.with_index
|> Stream.map(fn {num, idx} -> num * idx end)
|> Enum.sum