2013-01-05 8 views
10

में बदल गया। मैं कुछ कोड 2.9 से 2.10 में परिवर्तित कर रहा था और एक अप्रत्याशित संकलन त्रुटि में आया था। यहाँ कम से कम रूप है:flatMap व्यवहार 2.10.0

2.9.2 में, यह ठीक काम करता है:

scala> List(1).flatMap(n => Set(1).collect { case w => w }) 
res0: List[Int] = List(1) 

2.10.0 में, हम कोई त्रुटि मिलती है:

scala> List(1).flatMap(n => Set(1).collect { case w => w }) 
<console>:8: error: no type parameters for method flatMap: (f: Int => scala.collection.GenTraversableOnce[B])(implicit bf: scala.collection.generic.CanBuildFrom[List[Int],B,That])That exist so that it can be applied to arguments (Int => scala.collection.immutable.Set[_ <: Int]) 
--- because --- 
argument expression's type is not compatible with formal parameter type; 
found : Int => scala.collection.immutable.Set[_ <: Int] 
required: Int => scala.collection.GenTraversableOnce[?B] 
       List(1).flatMap(n => Set(1).collect { case w => w }) 
        ^
<console>:8: error: type mismatch; 
found : Int => scala.collection.immutable.Set[_ <: Int] 
required: Int => scala.collection.GenTraversableOnce[B] 
       List(1).flatMap(n => Set(1).collect { case w => w }) 
           ^
<console>:8: error: Cannot construct a collection of type That with elements of type B based on a collection of type List[Int]. 
       List(1).flatMap(n => Set(1).collect { case w => w }) 
          ^

लेकिन यह 2.10.0 में ठीक काम करता है अगर मैं स्पष्ट रूप से एक List में भीतरी परिणाम देते हैं या स्पष्ट रूप से flatmap के जेनेरिक प्रकार निर्दिष्ट करें:

scala> List(1).flatMap(n => Set(1).collect { case w => w }.toList) 
res1: List[Int] = List(1) 
scala> List(1).flatMap[Int, List[Int]](n => Set(1).collect { case w => w }) 
res2: List[Int] = List(1) 

क्या कोई मुझे बता सकता है कि परिवर्तन 2.10 के लिए क्या था जिससे टाइप अनुमान को विफल होने का कारण बनता है जब यह 2.9 में नहीं था?

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

एक छोटे से गहरी खुदाई, हम देख सकते हैं कि इस मुद्दे को collect के व्यवहार में एक फर्क से उत्पन्न होती है:

2.9.2 में:

scala> Set(1).collect { case w => w } 
res1: scala.collection.immutable.Set[Int] = Set(1) 

में 2.10.0:

scala> Set(1).collect { case w => w } 
res4: scala.collection.immutable.Set[_ <: Int] = Set(1) 

संभावित रूप से इस तथ्य के साथ कारण है कि Set, उदाहरण के लिए, उदाहरण के लिए List, प्रकार invariant है। लेकिन एक और पूर्ण स्पष्टीकरण, और विशेष रूप से जो इस परिवर्तन के लिए प्रेरणा देता है, वह बहुत अच्छा होगा।

+0

में काम करते हैं यह संग्रह नया गतिशील के लिए संगत बनाने के लिए हो सकता है कर सकते हैं मान वृद्धि - यानी चीजें हैं जो "विस्तार" इंट अब स्वीकार किया जाएगा (यह मानते हुए मैं ठीक से है नई गतिशील मान धारणा सही ढंग से व्याख्या की। – chaotic3quilibrium

उत्तर

6

यह bug है। तुम भी इसके चारों ओर पैटर्न टाइप करके, के रूप में

scala> Set(1).collect { case w => w } 
res0: scala.collection.immutable.Set[_ <: Int] = Set(1) 

scala> Set(1).collect { case w: Int => w } 
res1: scala.collection.immutable.Set[Int] = Set(1) 
संबंधित मुद्दे