2011-10-06 23 views
33

किसी को भी कृपया मुझे व्याख्या कर सकते हैं कारण है कि मैं कर सकते हैं:प्रयोग

a.mapValues(_.size) 
बजाय

a.mapValues(x => x.size) 

लेकिन मैं

a.groupBy(_) 

बजाय ऐसा नहीं कर सकते

a.groupBy(x => x) 
+11

आप 'मामलों में identity' उपयोग कर सकते हैं जहां समारोह की जरूरत है' एक्स: वास्तव में, वहाँ एक तिहाई अंडरस्कोर, जैसे कि एक विधि मूल्य में एक विधि (जो भी एक गुमनाम समारोह है) कन्वर्ट करने के लिए प्रयोग किया जाता है है => x': 'एक समूह द्वारा पहचान ' – incrop

+2

@incrop टिप के लिए धन्यवाद, मैंने कभी नहीं देखा कि पहचान फ़ंक्शन पहले से ही' प्रीडिफ 'में था ... – paradigmatic

उत्तर

15

यह यहाँ देखने के लिए आसान नहीं है:

a.groupBy(_) 

लेकिन यह कुछ इस तरह में यह देखने के लिए आसान है:

a.mkString("<", _, ">") 

मैं आंशिक रूप से विधि/समारोह को लागू करने कर रहा हूँ। मैं इसे कुछ मानकों (प्रथम और अंतिम) के लिए आवेदन कर रहा हूँ, और दूसरा पैरामीटर लागू न किए गए छोड़ रहा है, इसलिए मैं इस तरह एक नया कार्य हो रही है:

x => a.mkString("<", x, ">") 

पहला उदाहरण है सिर्फ एक विशेष मामले में जहां एकमात्र पैरामीटर आंशिक रूप से लागू होता है। जब आप अभिव्यक्ति पर अंडरस्कोर का उपयोग करते हैं, हालांकि, यह किसी अज्ञात फ़ंक्शन में स्थितित्मक पैरामीटर का खड़ा होता है।

a.mapValues(_.size) 
a.mapValues(x => x.size) 

भ्रमित होना आसान है, क्योंकि दोनों का परिणाम अज्ञात कार्य होता है।

a.groupBy _ 
39

जब आप a.groupBy(_) लिखने संकलक एक गुमनाम समारोह के रूप में यह समझता है:

x => a.groupBy(x) 

को स्काला विनिर्देशों §6.23, एक अभिव्यक्ति में एक अंडरस्कोर प्लेसहोल्डर एक गुमनाम पैरामीटर की जगह अनुसार। तो:

  • _ + 1x => x + 1
  • f(_) करने के लिए विस्तारित किया गया है x => f(x)
  • _ करने के लिए विस्तारित किया गया है अपने आप में विस्तार नहीं किया गया है (प्लेसहोल्डर किसी भी अभिव्यक्ति का हिस्सा नहीं है)।

अभिव्यक्ति x => a.groupBy(x) संकलक को भ्रमित कर देगा क्योंकि यह x के प्रकार का अनुमान नहीं लगा सकता है। यदि a प्रकार E तत्वों में से कुछ संग्रह है, तो संकलक उम्मीद x प्रकार (E) => K के एक समारोह हो, लेकिन टाइप K नहीं लगाया जा सकता है ...

+0

हमम ... क्यों? :-) –

+0

@HugoSFerreira उत्तर स्पष्टीकरण के साथ अद्यतन किया गया। – paradigmatic

+0

धन्यवाद। लेकिन, फिर 'a.mapValues ​​(_। आकार) 'क्यों नहीं है' x => a.mapValues ​​(x.size)'? –

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