Как рассчитать стандартное значение в Scala с функциями высокого порядка - PullRequest
0 голосов
/ 01 декабря 2018

Я новичок в скале.В последнее время я пытался написать некоторые математические функции, но я не понимаю, что я делаю неправильно.

import scala.annotation.tailrec
import scala.math.{pow, sqrt}

object HikeStatProcessor {

  def mean(list: List[Double]): Double = {
    sum(list, value => value) / list.size
  }

  def std(list: List[Double]): Double = {
    val means: Double = mean(list)
    sqrt(pow(sum(list, (head: Double) => head - means), 2) / list.size)
  }

  private def sum(list: List[Double],
                  operation: Double => Double): Double = {
    @tailrec
    def innerCalc(xs: List[Double], accu: Double): Double = {
      if (xs.isEmpty) return accu
      println(accu + operation(xs.head))
      innerCalc(xs.tail, accu + operation(xs.head))
    }
   innerCalc(list, 0)
  }

}

val a  = HikeStatProcessor.std(List(1, 2, 3))

Не могли бы вы предоставить исправление для приведенного выше кода и краткое объяснение того, что я делалнеправильно?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Спасибо всем за ответы.Я решил проблему, изменив def std на:

def std(list: List[Double]): Double = {
    val means: Double = mean(list)
    sqrt( sum(list, (head: Double) => pow(head - means, 2)) / (list.size - 1) )
  }

Проблема была вызвана тем, что я не оценил pow 2 в моей анонимной функции.

0 голосов
/ 01 декабря 2018

Рассмотрим это утверждение: sum(list, (head: Double) => head - means).Давайте разберем его на более мелкие шаги.

sum(list       , (head: Double) => head - means)
sum(List(1,2,3),             x  => x - 2)
sum(List(1-2, 2-2, 3-2))
          -1 +  0 +  1 = 0

Если вычесть среднее значение из каждого элемента, сумма всегда будет равна нулю (или близка к нему).Каково было ваше намерение?

...