在下面的代码中,除非导入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)
}
答案 0 :(得分:6)
<
方法来自具有Ops
特性的内部类Ordering
。 Ordering
内有一个隐式转换提供了这种转换,但是仅仅拥有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