我正在尝试按列表条目与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)
答案 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)