2015-11-03 10 views
16

私の現在のソリューションは、アレイ上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

あなたが試したことはまったく問題ありません。何を探していますか? – coderVishal

+0

@coderVishalはい、私はそれが既に得ることができるほど簡単だと思います。 – domp

+0

あなたはRubyのEnumerable.each_with_indexと同じものが欲しいのですが – cuonglm

答えて

12

あなたはEnum.reduce関数は二つの引数を持たなければならないことを覚えておく必要があります。したがって、それに応じて変更を加える必要があります。あなたが何をしたか

は完全に大丈夫でした。あなたの仕様に応じて使用することもできます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) 
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 
+0

ああ、引数リストの中でパターンマッチングについて忘れました。 、 ありがとうございました! – domp

3

なぜ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にするという事実を利用することができます。