Как сравнить общие значения перечисления? - PullRequest
2 голосов
/ 01 мая 2019

Я пытаюсь написать общий метод max для значений Scala Enumeration. У меня

def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
  case x if x > 0 => v1
  case x if x < 0 => v2
  case _ => v1
}

но я получаю довольно загадочное сообщение об ошибке

[error] overloaded method value compare with alternatives:
[error]   ((that: _1.Value)Int) forSome { val _1: E } <and>
[error]   (that: _1.Value)Int
[error]  cannot be applied to (V)
[error]   def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
[error]                                                                     ^

Кто-нибудь знает, что здесь происходит? Есть ли лучший способ сделать это? Спасибо.

Связанный вопрос: Получение заказа на кошку для перечисления Скалы

Ответы [ 2 ]

5 голосов
/ 01 мая 2019

Достаточно добавить привязку к контексту Ordering

def enumMax[E <: Enumeration, V <: E#Value : Ordering](v1: V, v2: V): V = v1.compare(v2) match {
  case x if x > 0 => v1
  case x if x < 0 => v2
  case _ => v1
}

Это было просто неясное сообщение об ошибке компилятора.


Попробуйте

def enumMax(e: Enumeration)(v1: e.Value, v2: e.Value): e.Value = v1.compare(v2) match {
  case x if x > 0 => v1
  case x if x < 0 => v2
  case _ => v1
}
4 голосов
/ 01 мая 2019

Вы можете написать общий max, например:

def max[T](a: T, b: T)(implicit ord: Ordering[T]) =
  if (ord.compare(a, b) >= 0) { a } else { b }

Если вы хотите, вы можете ограничить поддерживаемые типы, но не совсем понятно, что это особенно полезно.

def maxEnum[T <: Enumeration#Value](a: T, b: T)(implicit ord: Ordering[T]) =
  if (ord.compare(a, b) >= 0) { a } else { b }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...