scala - ошибка "расходящегося неявного расширения" при использовании sortBy
Интересно, почему 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 ответ
Если вы посмотрите на тип подписи 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
вызывает эту проблему, и я иду спать, поэтому не могу думать об этом дальше...