2015-05-08 11 views
8

Kontrol dışarı bu REPL oturumu Tek geçerli:Shuffling Aralığı (ı okunabilirlik için o kadar tidied ettik)

scala> val x = 1 to 10 
x: Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

scala> val y = x.toSeq 
y: Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

scala> x eq y 
res14: Boolean = true 

scala> util.Random.shuffle(y) 
<console>:10: error: Cannot construct a collection of type scala.collection.AbstractSeq[Int] with elements of type Int based on a collection of type scala.collection.AbstractSeq[Int]. 
       util.Random.shuffle(y) 
           ^

scala> util.Random.shuffle(x) 
res16: scala.collection.immutable.IndexedSeq[Int] = Vector(8, 3, 4, 2, 10, 9, 7, 5, 6, 1) 

Birincisi, bu tür farklı olmasından bağımsız olarak çalışması gerekir. Soru 'Neden?' Bir Range aksine Nedense

cevap

2

, shuffle için tür çıkarsama bir Inclusive için farklı bir sonuç üretir.

override def toSeq = this 

yerine geçersiz kılınan yöntemi sonucu türünü anlaması için açık bir sorun vardır:

nedeni Range yılında toSeq sonuç tanımı masum türünü daraltır olmasıdır.

scala> import util.Random.shuffle 
import util.Random.shuffle 

scala> val x = 1 to 10 
x: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

scala> val y = x.toSeq 
y: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

scala> val z: Range = x 
z: Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

scala> shuffle(x) 
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 5, 2, 10, 9, 6, 3, 7, 4, 8) 

scala> shuffle(y) 
<console>:11: error: Cannot construct a collection of type scala.collection.AbstractSeq[Int] with elements of type Int based on a collection of type scala.collection.AbstractSeq[Int]. 
       shuffle(y) 
        ^

çıkarımlandı ve örtük neyi kullanıldı ne olduğunu görmek için Snipping:

scala> :replay -Xprint:typer 

Replaying: shuffle(x) 
     private[this] val res0: scala.collection.immutable.IndexedSeq[Int] = scala.util.Random.shuffle[Int, scala.collection.immutable.IndexedSeq]($line5.$read.$iw.$iw.x)(immutable.this.IndexedSeq.canBuildFrom[Int]); 

scala> shuffle(y) 
     private[this] val <res1: error>: <error> = scala.util.Random.shuffle[Int, scala.collection.AbstractSeq]($line6.$read.$iw.$iw.y)(); 

yerine ümit ne:

REPL yalan olmadığını gösterme

scala> shuffle[Int, collection.immutable.IndexedSeq](z) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(6, 5, 3, 8, 4, 1, 2, 10, 7, 9) 

-Ytyper-debug ile, ek bir param A var. Inclusive için ed, ama nereden geldiğini bilmiyorum.

| | | | |-- x BYVALmode-EXPRmode-POLYmode (site: value res3 in $iw) 
| | | | | \-> scala.collection.immutable.Range.Inclusive 
| | | | solving for (T: ?T, CC: ?CC) 
| | | | solving for (A: ?A) 
| | | | [adapt] [A]=> scala.collection.generic.CanBuildFrom[scala.collect... adapted to [A]=> scala.collection.generic.CanBuildFrom[scala.collect... based on pt scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Int],Int,scala.collection.immutable.IndexedSeq[Int]] 
| | | | |-- [T, CC[X] <: TraversableOnce[X]](xs: CC[T])(implicit bf: ... EXPRmode (site: value res3 in $iw) 
| | | | | \-> scala.collection.immutable.IndexedSeq[Int] 
| | | | [adapt] [T, CC[X] <: TraversableOnce[X]](xs: CC[T])(implicit bf: ... adapted to [T, CC[X] <: TraversableOnce[X]](xs: CC[T])(implicit bf: ... 
| | | | \-> scala.collection.immutable.IndexedSeq[Int] 

Bu bir hata mı, davranış mı?

sade yapma:

scala> import language.higherKinds, collection.TraversableOnce, collection.generic.CanBuildFrom 
import language.higherKinds 
import collection.TraversableOnce 
import collection.generic.CanBuildFrom 

scala> def f[T, CC[X] <: TraversableOnce[X]](xs: CC[T])(implicit cbf: CanBuildFrom[CC[T],T,CC[T]]): CC[T] = null.asInstanceOf[CC[T]] 
f: [T, CC[X] <: scala.collection.TraversableOnce[X]](xs: CC[T])(implicit cbf: scala.collection.generic.CanBuildFrom[CC[T],T,CC[T]])CC[T] 

scala> f(1 to 10) 
res0: scala.collection.immutable.IndexedSeq[Int] = null 

scala> f(1 until 10) 
<console>:12: error: Cannot construct a collection of type scala.collection.AbstractSeq[Int] with elements of type Int based on a collection of type scala.collection.AbstractSeq[Int]. 
       f(1 until 10) 
      ^
5

O SI-6948, temel skala parçalanmışlığın neden a bug bu. Bazı ek açıklamalarla birlikte nice long commit message.

+0

https://gitter.im/scala/scala?at=554d5ab5675c1d50549ec0f1 muhtemelen yazım kurallarına aykırıdır. –