2014-05-07 14 views
6

Scala wersji 2.10.3 działa na java 7losowe shuffle nie pracuje dla zakresu

import scala.util.Random 
Random.shuffle(0 to 4) // works 
Random.shuffle(0 until 4) // doesn't work 

: 9: error: Nie można zbudować zbiór typu scala.collection.AbstractSeq [Int] z elementami typu Int oparty na kolekcji typu scala.collection.AbstractSeq [Int].

Komunikat o błędzie wydaje mi się naprawdę tylko powiedzieć "Nie możesz tego zrobić". Ktoś ma jakiś wgląd, dlaczego?

+0

Moja obecna praca: Random.shuffle ((0 do 4) .toIndexedSeq) –

+0

Zgaduję, że może to mieć coś wspólnego z '0 do 4' i' 0 do 4' jest różnymi klasami '0 do 4 res0: scala.collection.immutable.Range.Inclusive z scala.collection.immutable.Range.ByOne = zakresu (0, 1, 2, 3, 4) 0 do 4: scala.collection.immutable RES1. Zakres z scala.collection.immutable.Range.ByOne = Zakres (0, 1, 2, 3) ' – Andrey

+0

@Andrey tak, zauważyłem, że ... Spojrzałem na podpis typu dla shuffle: def shuffle [T, CC [ X] <: scala.TraversableOnce [X]] (xs: CC [T]) (niejawny bf: scala.collection.ganBuildFrom [CC [T], T, CC [T]]): CC [T] = {/ * skompilowany kod * /}. Widzę, że błąd pochodzi z CanBuildFrom.class i że nie może znaleźć niejawnej dla klasy .Range.ByOne –

Odpowiedz

6

Scala wnioskuje o nieprawidłowym typie parametrów do shuffle. można wymusić te pracować:

Random.shuffle[Int, IndexedSeq](0 until 4) 

lub połamanych z nich:

Random.shuffle[Int, AbstractSeq](0 to 4) 

Nie wiem, dlaczego to wyjdzie z niewłaściwych parametrów Range, zwracanego przez until, ale poprawna te dla Range.Inclusive, as zwracane przez to. Range.Inclusive bezpośrednio podklasy Range bez mieszania się z żadnymi cechami, więc nie powinno być traktowane inaczej. To dla mnie wygląda jak błąd Scala.

+1

Oto błąd: https://issues.scala-lang.org/browse/SI-6948 –