scala - ошибка "расходящегося неявного расширения" при использовании sortBy - PullRequest
9 голосов
/ 29 февраля 2012

Интересно, почему List(3,2,1).toIndexedSeq.sortBy(x=>x) не работает:

scala> List(3,2,1).toIndexedSeq.sortBy(x=>x) // Wrong
<console>:8: error: missing parameter type
              List(3,2,1).toIndexedSeq.sortBy(x=>x)
                                              ^
<console>:8: error: diverging implicit expansion for type scala.math.Ordering[B]
starting with method Tuple9 in object Ordering
              List(3,2,1).toIndexedSeq.sortBy(x=>x)
                                             ^

scala> Vector(3,2,1).sortBy(x=>x) // OK
res: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

scala> Vector(3,2,1).asInstanceOf[IndexedSeq[Int]].sortBy(x=>x) // OK
res: IndexedSeq[Int] = Vector(1, 2, 3)

scala> List(3,2,1).toIndexedSeq.sortBy((x:Int)=>x) // OK
res: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3)

1 Ответ

6 голосов
/ 29 февраля 2012

Если вы посмотрите на сигнатуру типа toIndexedSeq на List, вы увидите, что она принимает параметр типа B, который может быть любым супертипом A:

def toIndexedSeq [B >: A] : IndexedSeq[B] 

Если вы пропустите этот параметр типа, то компилятор по сути должен угадать, что вы имели в виду, выбирая наиболее конкретный тип из возможных.Вы могли бы иметь в виду List(3,2,1).toIndexedSeq[Any], который, конечно, не может быть отсортирован, так как нет Ordering[Any].Кажется, что компилятор не будет играть «угадать параметр типа», пока все выражение не будет проверено на правильность ввода (возможно, кто-то, кто знает что-то о внутренностях компилятора, может расширить это).

Чтобы заставить его работать, выможет либо а) предоставить требуемый параметр типа самостоятельно, т.е.

List(3,2,1).toIndexedSeq[Int].sortBy(x=>x)

, либо б) разделить выражение на два, так что параметр типа должен быть выведен перед вызовом sortBy:

val lst = List(3,2,1).toIndexedSeq; lst.sortBy(x=>x)

Редактировать:

Это, вероятно, потому что sortBy принимает аргумент Function1.Подпись sortBy -

def sortBy [B] (f: (A) => B)(implicit ord: Ordering[B]): IndexedSeq[A] 

, тогда как sorted (который вы должны использовать вместо этого!) Отлично работает с List(3,2,1).toIndexedSeq.sorted

def sorted [B >: A] (implicit ord: Ordering[B]): IndexedSeq[A] 

Я не совсем уверен, почемуFunction1 вызывает эту проблему, и я иду спать, поэтому не могу думать об этом дальше ...

...