繁体   English   中英

Scala sortBy缺少扩展函数的参数类型

[英]Scala sortBy Missing parameter type for expanded function

我已经创建了这样的列表列表,我可以根据大小轻松对其进行排序。

@ List(List(2, 2, 3), List(7)).sortBy(_.size)
res71: List[List[Int]] = List(List(7), List(2, 2, 3))

但是,如果我有重复的列表,我想消除我可以做的重复

@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList
res72: List[List[Int]] = List(List(2, 2, 3), List(7))

你可以看到上面列表的数据类型仍然是List [List [Int]]

现在,如果我尝试

@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(_.size)
cmd73.sc:1: missing parameter type for expanded function ((x$2: <error>) => x$2.size)
val res73 = List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(_.size)
                                                                                          ^
Compilation Failed

我也试过了

@ List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(x => x.size)
cmd73.sc:1: missing parameter type
val res73 = List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy(x => x.size)
                                                                                          ^
Compilation Failed

我有点困惑。 我手动构建的List [List [Int]]与从toList函数返回的List [List [Int]]有什么区别? 为什么我可以在第一个上调用sortBy ,但我不能在第二个上调用sortBy?

在上面的例子中, .toSet丢失了List[T]元素类型,

def toSet[B >: A]: immutable.Set[B] = to[immutable.Set].asInstanceOf[immutable.Set[B]]

scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach(x => println(x))
<console>:12: error: missing parameter type
       List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach(x => println(x))
                                                                           ^

但是你可以验证它为简单类型T提供了正确的类型,

scala> List(1, 2, 3, 4, 5, 4, 3, 2, 1).toSet.toList.sorted
res0: List[Int] = List(1, 2, 3, 4, 5)

因此,仅指定List[T]的类型是有效的。

scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.foreach((x: List[Int]) => println(x))
List(2, 2, 3)
List(7)

//set type to toSet
scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet[List[Int]].foreach(x => println(x))
List(2, 2, 3)
List(7)

为了使你的示例工作,在处理elem时给出toSet (也见另一个答案 )或elem类型。

scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet.toList.sortBy((x: List[Int]) => x.size)
res2: List[List[Int]] = List(List(7), List(2, 2, 3))

而且,您可以使用.distinct而不是.toSet

scala> List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).distinct.sortBy(_.size)
res3: List[List[Int]] = List(List(7), List(2, 2, 3))

问题来自toSet的定义:

def toSet[B >: A]: Set[B]

如您所见,有一个类型参数可以推断出来。 Scala仍然可以在你的第一个示例中使用toSet来推断这toSet ,但是涉及lambda的那个有更复杂的类型推断,Scala显然无法处理。 您可以通过为lambda提供参数类型或更简单地为toSet类型参数来toSet

List(List(2, 2, 3), List(3, 2, 2), List(7)).map(_.sorted).toSet[List[Int]].toList
    .sortBy(_.size)

正如prayagupd 指出的那样 ,你也可以使用.distinct

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM