Почему я должен импортировать Ordering.Implicits? - PullRequest
1 голос
/ 25 июня 2019

В коде ниже я получаю ошибку компиляции, если я не импортирую 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 ]

6 голосов
/ 25 июня 2019

Метод < происходит от внутреннего класса Ops черты Ordering.Внутри Ordering есть неявное преобразование, которое обеспечивает его, но просто наличие неявного экземпляра Ordering недостаточно для того, чтобы это находилось в области видимости.Вы можете импортировать его явно:

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

... или вы можете импортировать Ordering.Implicits, который содержит несколько служебных методов для обработки Ordering.Одним из них является неявное преобразование, которое предоставляет экземпляр Ops всякий раз, когда у вас есть Ordering в области действия .

1 голос
/ 25 июня 2019

Причина, по которой вам нужно импортировать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...