web-dev-qa-db-ja.com

Elixirのインデックスで減らす方法は?

私の現在の解決策は、配列でwith_indexを実行してから、reduceを実行することです。

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

要素のインデックスを要素にアタッチしてから、配列に対してreduceを実行するメソッドはありますか?

20
domp

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)
17
coderVishal

_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_でパターンマッチングを行うことができます。

12
Fomentia

引数リスト内で直接パターンマッチングを行うことができます。

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
9
Patrick Oscity