2

我正在尝试为 ScalaEnumeration值编写一个通用的 max 方法。我有

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]                                                                     ^

有人知道这里发生了什么吗?有没有更好的方法来实现这一点?谢谢。

相关问题:为 Scala 的枚举推导 Cats Order

4

2 回答 2

5

添加上下文绑定就足够了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
}
于 2019-05-01T17:58:38.257 回答
4

你可以写一个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 }
于 2019-05-01T19:03:19.037 回答