在下面的代码中,除非导入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)
}发布于 2019-06-25 09:52:42
<方法来自Ordering特性的内部类Ops。在Ordering中有一个隐式转换提供了它,但是仅仅有一个Ordering的隐式实例还不够。您可以显式导入它:
val ordering = implicitly[Ordering[A]]
import ordering.mkOrderingOps...or您可以导入Ordering.Implicits,它包含一些处理Ordering的实用方法。其中之一是 in scope的隐式转换。
发布于 2019-06-25 09:51:22
需要导入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
https://stackoverflow.com/questions/56751081
复制相似问题