2015-03-03 7 views
6

के रूप में एक सरणी का उपयोग करें मैं एक सरणी पर एक foldLeft का उपयोग करने की कोशिश कर रहा हूँ। उदाहरण:एक सरणी फोल्ड लाइफ accumulator

var x = some array 
x.foldLeft(new Array[Int](10))((a, c) => a(c) = a(c)+1) 

यह त्रुटि (0) आवश्यक ऐरे [Int] त्रुटि से संकलित करने से इंकार कर देता है।

+0

क्या आप जानते हैं कि 'कुछ गणना' को 'ऐरे [Int]' का मूल्यांकन करना चाहिए और 'नया ऐरे [Int] (10)' 10 तत्वों की सरणी बनाता है? यदि आप शेष कोड दिखाते हैं तो यह सहायक होगा। या कम से कम इरादा। – ale64bit

+0

कोड जोड़ा गया। – user1742188

+1

'ए (सी) = ए (सी) + 1' में 'यूनिट' टाइप किया गया है जबकि आपको 'ऐरे [Int]' की आवश्यकता है। आप अपने कोड के साथ वास्तव में क्या हासिल करना चाहते हैं? – ale64bit

उत्तर

5

क्रम कि आप क्या करना चाहते हैं, और अपनी शैली निम्नलिखित में foldLeft उपयोग करने के लिए, आप बस लौट सकते हैं इस तरह गणना में एक ही संचायक सरणी:

:

val ret = a.foldLeft(new Array[Int](10)) { 
     (acc, c) => acc(c) += 1; acc 
    } 

वैकल्पिक रूप से, के बाद से अपने संख्या 0 से 9 तक कर रहे हैं, आप भी इस एक ही परिणाम प्राप्त करने के लिए क्या कर सकते हैं

2

स्कैला में असाइनमेंट एक मूल्य (लेकिन इसके बजाय यूनिट) वापस नहीं करता है, इसलिए आपकी अभिव्यक्ति जो अगले चरण के लिए ऐरे [Int] लौटाती है वह यूनिट जो काम नहीं करती है।

आप एक ब्लॉक का उपयोग करें और इस तरह अंत में सरणी वापस जाने के लिए होगा:

x.foldLeft(new Array[Int](10)) { (a, c) => 
    a(c) = a(c)+1 
    a 
} 
+0

एक स्पष्ट स्पष्टीकरण, यह है कि यदि आप किसी चीज़ को 'foldLeft' के परिणाम असाइन नहीं करते हैं, तो यह खो जाएगा। लेकिन बस मामले में। – ale64bit

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