Проблема связана с стиранием типа, которое можно преодолеть с помощью класса Numeric
.
def avg[N:Numeric](ns :Seq[N]) :Double =
implicitly[Numeric[N]].toDouble(ns.sum) / ns.length
avg(List(3, 5, 7, 11)) //res0: Double = 6.5
avg(Vector(9.2, 3.3, 1.7, 21.1)) //res1: Double = 8.825
Вы также можете поместить его в неявный класс для более краткого выражения.
implicit class GetAvg[N:Numeric](ns :Seq[N]) {
def avg :Double = implicitly[Numeric[N]].toDouble(ns.sum) / ns.length
}
Stream(3, 5, 7, 11).avg //res2: Double = 6.5
Seq(9.2, 3.3, 1.7, 21.1).avg //res3: Double = 8.825