Не совсем понятно, чего вы пытаетесь достичь.
Прежде всего, ограничение B <: Int
не имеет смысла, поскольку Int
- это класс final
в Scala.
Во-вторых, использование reduce
вместе с -
также не имеет смысла, поскольку -
не является коммутативным .Это важно, потому что reduce
в отличие от reduceLeft
/ reduceRight
или foldLeft
/ foldRight
не гарантирует порядок оценки.На самом деле
def reduce[A1 >: A](op: (A1, A1) => A1): A1 = reduceLeft(op)
является такой же допустимой реализацией по умолчанию, как и
def reduce[A1 >: A](op: (A1, A1) => A1): A1 = reduceRight(op)
, но очевидно, что они будут давать разные результаты для операции -
.
Из точки более высокого уровняПредставьте, что нечто похожее на то, чего вы хотите достичь, может быть сделано с помощью классов типов и особенно Numeric
.Например, у вас может быть такой метод:
def product[B: Numeric](data: Seq[B]): B = {
val numeric = implicitly[Numeric[B]]
data.reduce(numeric.times)
}
Обратите внимание, что умножение является коммутативным, поэтому это разумная реализация.На самом деле это почти то, как sum
и product
реализованы в стандартной библиотеке.Основное отличие состоит в том, что реальная реализация использует foldLeft
, что позволяет определить значение по умолчанию для пустого Seq
(0 и 1 соответственно)