为什么我必须导入Ordering.Implicits?

时间:2019-06-25 09:41:39

标签: scala

在下面的代码中,除非导入Ordering.Implicits,否则会出现编译错误。为什么需要导入?有办法解决吗?我在做一些完全不在基地的事情吗?

Error:(15, 38) value < is not a member of type parameter A
      case (ah :: as, bh :: _) if ah < bh => findOverlap(c, as, b)
  private def foo[A : Ordering](c: mutable.Set[A], a: Seq[A], b: Seq[A]): mutable.Set[A] =
    (a, b) match {
      case (ah :: _, bh :: _) if ah == bh => c + ah
      case (ah :: as, bh :: _) if ah < bh => foo(c, as, b)
      case (_, _ :: bs) => foo(c, a, bs)
    }

2 个答案:

答案 0 :(得分:6)

<方法来自具有Ops特性的内部类OrderingOrdering内有一个隐式转换提供了这种转换,但是仅仅拥有Ordering的隐式实例还不足以将其包含在范围内。您可以显式导入它:

  val ordering = implicitly[Ordering[A]]
  import ordering.mkOrderingOps

...或者您可以导入Ordering.Implicits,其中包含一些用于处理Ordering的实用程序方法。其中之一是provides an Ops instance whenever you have an Ordering in scope的隐式转换。

答案 1 :(得分:1)

您需要导入Ordering.Implicits的原因是使用了<>之类的布尔运算。

通过导入,您告诉编译器使用scala.math.Ordering.Ops

  class Ops(lhs: T) {
    def <(rhs: T) = lt(lhs, rhs)
    def <=(rhs: T) = lteq(lhs, rhs)
    def >(rhs: T) = gt(lhs, rhs)
    def >=(rhs: T) = gteq(lhs, rhs)
    def equiv(rhs: T) = Ordering.this.equiv(lhs, rhs)
    def max(rhs: T): T = Ordering.this.max(lhs, rhs)
    def min(rhs: T): T = Ordering.this.min(lhs, rhs)
  }

允许您以类型<呼叫A