2013-01-05 8 views
10

Bazı kodları 2.9'dan 2.10'a dönüştürüyordum ve beklenmedik bir derleme hatasıyla karşılaştım. İşte asgari biçimi şöyledir:flatMap davranışı 2.10.0 olarak değiştirildi

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

2.10.0, biz bir hatayla: 2.9.2

, bu iyi çalışır

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 }) 
          ^

Ama 2.10.0 yılında çalışıyor Ben açıkça bir List içine iç sonucunu açmak veya açıkça flatmap jenerik türlerini belirtirseniz:

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) 

Birisi bana, 2,9'a gelindiğinde, tür çıkarımının burada başarısız olmasına neden olan değişikliğin 2.10'a ne olduğunu açıklayabilir mi?

DÜZENLEME:

2.9.2 yılında:

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

yılında biraz daha derin Kazı

, biz sorunu collect davranışlarında bir farktan doğar görebilirsiniz 2.10.0:

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

Muhtemelen, örneğin List'un aksine, Set'un, tür değişmez olduğu gerçeği ile ilgisi vardır. Ama daha eksiksiz bir açıklama ve özellikle bu değişim için motivasyon veren bir tanesi harika olurdu.

+0

olduğu gibi desen yazarak etrafında çalışabilirsiniz Yeni Dinamik Değerler kavramını doğru olarak yorumladı. – chaotic3quilibrium

cevap

6

bug'dur. (Düzgün var varsayarak Int şimdi kabul edilecektir "genişletmek" olduğunu, yani şeyler - Ayrıca geliştirme Değerleri yeni Dinamik için koleksiyonları uyumlu hale getirmek için olabilir

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)