缺少_ _`的参数类型

时间:2016-05-31 19:02:50

标签: scala

我正在尝试按列表条目与num的接近程度对列表进行排序。

我决定尝试使用sortWith,但以下代码段为:

list.sortWith(math.abs(_ - num) < math.abs(_ - num))

在scala中缺少_的参数类型失败。 列表的类型为List[Int]

在其他主题之后,我知道_在某种程度上类型不明确,但我不确定原因,(以及为什么以下代码段不是类型不明确的):

scala> val sortedDudes = dudes.sortWith(_.name < _.name)
sortedDudes: Array[Person] = Array(Al, Paul, Tyler)

Source

2 个答案:

答案 0 :(得分:3)

xhr

完美地工作。这是因为scala尝试从 def foo = { val num = 2 val list: List[Int] = List(1, 2) list.sortWith((a, b) => math.abs(a - num) < math.abs(b - num)) } 获取_,而不是math.abs

答案 1 :(得分:1)

在Scala中,_可用于各种不同的情况,以表示不同的事物。 this question上的答案应该有助于澄清其中的一些。

回到这个问题,似乎OP正在尝试使用_进行参数替换。请考虑以下示例

List(1,2,5,7).filter(_ > 4)

此处filter采用A => Unit类型的函数,因此以上是

的简写
List(1,2,5,7).filter(x => x > 4)

下划线可以代表多个参数,但必须使用它来恰好引用每个参数一次。这就是OP中的sortedDudes代码段工作的原因。因此,以下是合法的。

List(1,2,5,7).reduce(_ + _)

这是

的简写
List(1,2,5,7).reduce((a,b) => a + b)

我认为原始代码段的问题在于编译器无法根据(A, A) => Boolean方法的要求明确地将其解析为sortWith类型的内容。我们可以给编译器一些帮助,如下所示。

scala> def op(int: Int, num: Int) = math.abs(int - num)
op: (int: Int, num: Int)Int

scala> List(1,7,5,10).sortWith(op(_, 5) < op(_, 5))
res0: List[Int] = List(5, 7, 1, 10)