如何使用高阶函数计算scala中的std

How to calculate the std in scala with high order functions

我是 Scala 新手。 最近我试着写一些数学函数,但我不明白我做错了什么。

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))

能否请您修复以上代码并简要说明我做错了什么?

考虑以下语句: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

如果从每个元素中减去平均值,总和将始终为零(或接近于零)。你的意图是什么?

感谢大家的回答。 我通过将 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。