反转订购会导致编译错误

时间:2015-12-25 17:13:58

标签: scala

我想为String对定义反向排序。 由于一些不明原因,在下面的代码中,第一行编译(我可以稍后使用ord1.reverse)而第二行不编译。

object Bug {
  def main(args: Array[String]) {
    val ord1: Ordering[(String, String)] = Ordering.by(_._1)
    val ord2: Ordering[(String, String)] = Ordering.by(_._1).reverse
  }
}

这段代码有什么问题?为什么不能在这里打电话给.reverse但以后好吗?什么是分歧的隐含扩张'

我在repl中得到的错误:

<console>:10: error: missing parameter type for expanded function ((x$1) => x$1._1)
       val ord2: Ordering[(String, String)] = Ordering.by(_._1).reverse
                                                          ^
<console>:10: error: diverging implicit expansion for type scala.math.Ordering[S]
starting with method Tuple9 in object Ordering
       val ord2: Ordering[(String, String)] = Ordering.by(_._1).reverse
                                                         ^

编辑:我发现写这个:

val ord2: Ordering[(String, String)] = Ordering.by((_: (String, String))._1).reverse

编译,但它对我来说仍然没有意义,加上代码很丑陋。

1 个答案:

答案 0 :(得分:4)

这是Scala编译器类型推断的限制。它无法推断此调用的类型:

def by[T, S](f: T => S)(implicit ord: Ordering[S]): Ordering[T]

因为您没有直接类型的归属/返回类型,而是将其提供给第二个方法reverse,即使它没有更改排序的类型参数。

以下内容也适用:

val ord2a = Ordering.by[(String, String), String](_._1).reverse
val ord2b = (Ordering.by(_._1): Ordering[(String, String)]).reverse
val ord2c = ord1.reverse
相关问题