2012-02-29 13 views
9

का उपयोग कर मुझे आश्चर्य है कि क्यों List(3,2,1).toIndexedSeq.sortBy(x=>x) काम नहीं करता:स्केला - भ्रामक "अपसारी निहित विस्तार" त्रुटि जब "sortBy"

scala> List(3,2,1).toIndexedSeq.sortBy(x=>x) // Wrong 
<console>:8: error: missing parameter type 
       List(3,2,1).toIndexedSeq.sortBy(x=>x) 
              ^
<console>:8: error: diverging implicit expansion for type scala.math.Ordering[B] 
starting with method Tuple9 in object Ordering 
       List(3,2,1).toIndexedSeq.sortBy(x=>x) 
              ^

scala> Vector(3,2,1).sortBy(x=>x) // OK 
res: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) 

scala> Vector(3,2,1).asInstanceOf[IndexedSeq[Int]].sortBy(x=>x) // OK 
res: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> List(3,2,1).toIndexedSeq.sortBy((x:Int)=>x) // OK 
res: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3) 
+2

इसके अलावा, 'सूची (3,2,1) .toIndexedSeq.sortBy (पहचान)' एक और उपयोगी त्रुटि और 'सूची (3,2,1) देता है। toIndexedSeq [Int] .sortBy (x => x) 'ठीक काम करता है। – dhg

+0

नोट, कि आप sortBy और toIndexedSeq स्विच कर सकते हैं: 'सूची (3, 2, 1) .sortBy (x => x)। toIndexedSeq' –

उत्तर

6

आप List पर toIndexedSeq के प्रकार के हस्ताक्षर को देखो, तो आप देखेंगे कि यह लेता है एक प्रकार पैरामीटर B, जो A के किसी भी महाप्रकार हो सकता है:

def toIndexedSeq [B >: A] : IndexedSeq[B] 

आपको लगता है कि प्रकार पैरामीटर तो संकलक अनिवार्य रूप से लगता है कि करने के लिए आप क्या मतलब है बाहर छोड़ देते हैं, सबसे विशिष्ट प्रकार संभव लेने । आप List(3,2,1).toIndexedSeq[Any] का मतलब हो सकता है, जिसे निश्चित रूप से सॉर्ट नहीं किया जा सकता है क्योंकि Ordering[Any] नहीं है। ऐसा लगता है कि संकलक "टाइप पैरामीटर अनुमानित" नहीं खेलता है जब तक कि संपूर्ण अभिव्यक्ति को सही टाइपिंग के लिए चेक नहीं किया गया हो (हो सकता है कि कोई ऐसा व्यक्ति जो संकलक आंतरिक के बारे में कुछ जानता हो) इस पर विस्तार कर सकता है।

यह काम आप या तो एक) की आवश्यकता प्रकार पैरामीटर प्रदान कर सकते हैं अपने आप को यानी

List(3,2,1).toIndexedSeq[Int].sortBy(x=>x) 

या ख) दो भागों में अभिव्यक्ति अलग इसलिए प्रकार पैरामीटर sortBy कॉल करने से पहले अनुमान लगाया जा है कि करने के लिए:

val lst = List(3,2,1).toIndexedSeq; lst.sortBy(x=>x) 

संपादित करें:

यह शायद इसलिए है क्योंकिहैFunction1 तर्क लेता है। sortBy के हस्ताक्षर

def sortBy [B] (f: (A) => B)(implicit ord: Ordering[B]): IndexedSeq[A] 
जबकि sorted

है (जो आप के बजाय का उपयोग करना चाहिए!) List(3,2,1).toIndexedSeq.sorted

def sorted [B >: A] (implicit ord: Ordering[B]): IndexedSeq[A] 

साथ ठीक काम करता है मुझे यकीन है कि वास्तव में क्यों Function1 कारणों से इस समस्या को और मैं जा रहा हूँ नहीं कर रहा हूँ बिस्तर इसलिए इसके बारे में और नहीं सोच सकता ...

+0

2.10 के बाद से काम करता है। –

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