我想知道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)
最佳答案
如果查看toIndexedSeq
上List
的类型签名,您会看到它带有类型参数B
,它可以是A
的任何父类(super class)型:
def toIndexedSeq [B >: A] : IndexedSeq[B]
如果您忽略该类型参数,则编译器本质上必须猜测您的意思,并尽可能采用最具体的类型。您本可以使用
List(3,2,1).toIndexedSeq[Any]
,但由于没有Ordering[Any]
,因此当然无法对其进行排序。似乎在检查整个表达式的正确键入之前,编译器不会扮演“猜测类型参数”的角色(也许知道编译器内部知识的人可以对此进行扩展)。要使其正常工作,您可以a)自己提供所需的类型参数,即
List(3,2,1).toIndexedSeq[Int].sortBy(x=>x)
或b)将表达式分成两个,以便在调用
sortBy
之前必须推断出type参数: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
为何会导致此问题,我将上床 sleep ,因此无法进一步考虑...关于scala-使用 "diverging implicit expansion"时出现令人困惑的 "sortBy"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9492904/