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.
olduğu gibi desen yazarak etrafında çalışabilirsiniz Yeni Dinamik Değerler kavramını doğru olarak yorumladı. – chaotic3quilibrium