I wonder why List(3,2,1).toIndexedSeq.sortBy(x=>x) doesn’t work:
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)
If you look at the type signature of
toIndexedSeqonListyou’ll see it takes a type parameterB, which can be any supertype ofA:If you leave out that type parameter then the compiler essentially has to guess what you meant, taking the most specific type possible. You could have meant
List(3,2,1).toIndexedSeq[Any], which of course can’t be sorted since there’s noOrdering[Any]. It seems the compiler doesn’t play “guess the type parameter” until the whole expression has been checked for correct typing (maybe someone who knows something about compiler internals can expand on this).To make it work you can either a) provide the required type parameter yourself i.e.
or b) separate the expression into two so that the type parameter has to be inferred before calling
sortBy:Edit:
It’s probably because
sortBytakes aFunction1argument. The signature ofsortByiswhereas
sorted(which you should use instead!) works fine withList(3,2,1).toIndexedSeq.sortedI’m not sure exactly why
Function1causes this problem and I’m going to bed so can’t think about it further…