Вы смешиваете дисперсию с подтипом и классами типов , это разные понятия.
В этом случае вам действительно нужно толькоиспользуйте Numeric
класс типов .
object Utils {
def max[T : Ordering](list: List[T]): Option[T] = {
import Ordering.Implicits._
@annotation.tailrec
def loop(remaining: List[T], currentMax: T): T =
remaining match {
case Nil =>
currentMax
case t :: tail =>
val newMax =
if (t >= currentMax)
t
else
currentMax
loop(
remaining = tail,
newMax
)
}
list match {
case Nil => None
case t :: tail => Some(loop(remaining = tail, currentMax = t))
}
}
def sum[T : Numeric](list: List[T]): T = {
import Numeric.Implicits._
def loop(remaining: List[T], acc: T): T =
remaining match {
case Nil =>
acc
case t :: tail =>
loop(
remaining = tail,
acc + t
)
}
loop(remaining = list, acc = Numeric[T].zero)
}
}
, который вы можете использовать следующим образом:
Utils.sum(List(1, 2, 3))
// res: Int = 6
Utils.sum(List.empty[Int])
// res: Int = 0
Utils.max(List.empty[Int])
// res: Option[Int] = None
Utils.max(List(1, 2, 3))
// res: Option[Int] = Some(3)