2015-11-03 5 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) 

क्या कोई ऐसी विधि है जो तत्व के किसी तत्व की अनुक्रमणिका को संलग्न करती है और फिर सरणी पर कम करती है?

+0

आपने जो भी प्रयास किया वह बिल्कुल ठीक है, आप और क्या खोज रहे हैं? – coderVishal

+0

@coderVishal हाँ मुझे लगता है कि यह पहले से ही उतना आसान है जितना इसे प्राप्त हो सकता है। – domp

+0

ध्वनि जैसे आप रूबी – cuonglm

उत्तर

12

आपको याद रखना होगा कि 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) 
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 में पैटर्न मिलान में ट्यूपल जोड़े की सूचियां हैं।

संबंधित मुद्दे