Scala имеет ряд признаков, которые можно использовать в качестве классов классов, например Ordered и Numeric в пакете scala.math.
Я могу написать, например, общий метод с помощью Ordered следующим образом:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
Я хотел сделать аналогичную вещь с Numeric, но это не работает:
def g[T <% Numeric[T]](a: T, b: T) = a * b
Почему существует явное несоответствие между Ordered и Numeric?
Я знаю, что есть другие способы сделать это, следующее будет работать (использует привязку к контексту):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
Но это выглядит сложнее, чем просто использовать * для умножения двух чисел. Почему черта Numeric не включает такие методы, как *, а Ordered включает такие методы, как <?
Я также знаю Ordering, который можно использовать так же, как Numeric, см. также этот ответ:
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)