2015-11-03 6 views
16

Moje obecne rozwiązanie to uruchomienie with_index, a następnie reduce w tablicy.Jak zrobić redukcję za pomocą indeksu w eliksiru?

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

Czy istnieje metoda, która dołącza indeks elementu do elementu, a następnie uruchamia zmniejszenie w tablicy?

+0

To, czego się wypróbowałeś, jest w porządku, czego więcej szukasz? – coderVishal

+0

@coderVishal tak Przypuszczam, że jest to już tak proste, jak to tylko możliwe. – domp

+0

Brzmi jak chcesz coś takiego jak Enumerable.each_with_index w Ruby – cuonglm

Odpowiedz

12

Należy pamiętać, że funkcja Enum.reduce musi mieć dwa argumenty. Więc musisz odpowiednio zmienić.

To, co zrobiłeś, było zupełnie w porządku. Zgodnie z twoją specyfikacją możesz także użyć Enum.with_index

Alternatywnie możesz użyć akumulatora jako krotki, z jednym elementem reprezentującym indeks, a innym wynikiem.

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

Można zrobić mecz wzór bezpośrednio w liście argumentów:

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

Innym rozwiązaniem byłoby najpierw uzyskać produkty poprzez Stream.map a następnie użyć Enum.sum na koniec:

5..10 
|> Stream.with_index 
|> Stream.map(fn {num, idx} -> num * idx end) 
|> Enum.sum 
+0

ah that right, zapomniałem o dopasowaniu wzorca wewnątrz listy argumentów , Dziękuję Ci! – domp

3

Dlaczego nie używać Enum.with_index?

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

.with_index trwa przeliczalny i zwraca listę słów kluczowych z każdego elementu przeliczalny odwzorowanym na indeksie. Tak więc Enum.with_index([:hi, :hello, :greetings]) zwróci [hi: 0, hello: 1, greetings: 2]. Możemy wykorzystać fakt, że listy słów kluczowych Elixir są listami par krotek do dopasowania wzorców w .reduce.

Powiązane problemy