2012-10-29 15 views
10

वर्णों की सूची से उत्पन्न करने की कोशिश कर रहे हैं, उनकी आवृत्ति में मैप किए गए अद्वितीय वर्णों की एक सूची - उदा। कुछ की तरह:toSet को कॉल करके पैरामीटर प्रकार त्रुटि गुम है?

List('a','b','a') -> List(('a',2), ('b',1)) 

तो, सिर्फ सांत्वना में चारों ओर mucking, इस काम करता है:

val l = List('a', 'b', 'c', 'b', 'c', 'a')  
val s = l.toSet         
s.map(i => (i, l.filter(x => x == i).size)) 

लेकिन, अभी पिछले 2 लाइनों करता संयोजन नहीं द्वारा छोटा?

l.toSet.map(i => (i, l.filter(x => x == i).size)) 

त्रुटि "अनुपलब्ध पैरामीटर प्रकार" त्रुटि देता है।

कोई बता सकता है कि स्कैला इस वाक्यविन्यास के बारे में शिकायत क्यों करती है?

+0

, आप 'myList.groupBy (पहचान) .mapValues ​​उपयोग कर सकते हैं' (_ आकार।) आपके द्वारा पोस्ट की गई पहली चीज़ को पूरा करने के लिए। – Dylan

उत्तर

19

जब आप कहते हैं कि val s = l.toSet संकलक आंकड़े कि toSet के लिए ही समझदार प्रकार Char --that सबसे विशिष्ट विकल्प है। फिर, sChar का एक सेट दिया गया है, संकलक को पता चलता है कि नक्शा Char से होना चाहिए।

लेकिन दूसरे मामले में, यह toSet में तत्वों के प्रकार के बारे में निर्णय रोकता है। यह Char हो सकता है, लेकिन AnyVal भी काम करेगा, जैसा कि Any होगा।

l.toSet.map((i: Any) => (i, l.filter(x => x == i).size)) 

आम तौर पर नियम यह है कि संकलक को सबसे विशिष्ट मूल्य चुनना चाहिए। लेकिन चूंकि कार्य उनके तर्क में विरोधाभासी हैं, इसलिए वे सबसे विशिष्ट हैं जब वे Any तर्क के रूप में लेते हैं, इसलिए संकलक निर्णय नहीं ले सकता है। टाई तोड़ने के लिए एक नियम मौजूद हो सकता है ("प्रारंभिक धारणा को प्राथमिकता दें"), लेकिन कोई भी लागू नहीं किया गया है। तो यह आपकी मदद के लिए पूछता है।

आप या तो समारोह तर्क पर या toSet पर प्रकार प्रदान कर सकते हैं इस समस्या को ठीक करने के लिए: बस FYI

l.toSet.map((i: Char) => (i, l.filter(x => x == i).size)) 
l.toSet[Char].map(i => (i, l.filter(x => x == i).size)) 
+1

अच्छी तरह से समझाया, बहुत धन्यवाद। –

3

प्रकार [चर] से toSet प्रकार जोड़ना चाल करता है।

scala> l.toSet[Char].map(i => (i, l.filter(x => x == i).size)) 
scala.collection.immutable.Set[(Char, Int)] = Set((a,2), (b,2), (c,2)) 
+3

धन्यवाद, हालांकि उस तरह के सवाल ने "क्यों" को धक्का दिया, क्योंकि मैंने पहले उदाहरण में उस प्रकार की जानकारी प्रदान नहीं की थी। –

+0

"क्यों" भाग के लिए रेक्स का जवाब देखें। – Brian

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