Методы перегрузки Scala - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть небольшой вопрос об этом куске кода (который не компилируется):

       def avg(seq: Seq[Int]): Double = seq.sum.toDouble/seq.length
       def avg(seq: Seq[Double]): Double = seq.sum/seq.length 

Идея проста, как показано выше, первый метод вычисляет среднее значение для последовательности целых чисел, ивторая делает то же самое с последовательностью Doubles

, но она дает мне ошибку компиляции вокруг повторения, я хочу знать, почему ... и если у вас гораздо более подход Scala, чем этот код для выполнения той же идеипожалуйста, поделитесь им в своем ответе Спасибо

1 Ответ

0 голосов
/ 20 сентября 2018

Проблема связана с стиранием типа, которое можно преодолеть с помощью класса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...