gpt4 book ai didi

scala - 在 Scala 中编写一个通用的均值函数

转载 作者:行者123 更新时间:2023-12-04 01:31:12 25 4
gpt4 key购买 nike

我正在尝试编写一个通用的均值函数,该函数对包含数字类型的 Iterable 进行操作。例如,它将在数组上运行,如下所示:

val rand = new scala.util.Random()
val a = Array.fill(1000) { rand.nextInt(101) }
val b = Array.fill(1000) { rand.nextDouble }

println(mean(a))
println(mean(b))

等等,希望能够处理其他可迭代对象,例如列表。

我为平均方法尝试了各种咒语,但无济于事:
def mean[T <% Numeric[T]](xs: Iterable[T]) = xs.sum.toDouble / xs.size
def mean[A](xs: Iterable[Numeric[A]]):Double = xs.sum.toDouble / xs.size
def mean[T](xs: Iterable[T])(implicit num: Numeric[T]):Double = xs.sum / xs.size
def mean(xs: Iterable[Double]) = xs.sum / xs.size

在 Scala 中执行此操作的正确方法是什么?

最佳答案

这有效:

def mean[T : Numeric](xs: Iterable[T]): T = implicitly[Numeric[T]] match {
case num: Fractional[_] => import num._; xs.sum / fromInt(xs.size)
case num: Integral[_] => import num._; xs.sum / fromInt(xs.size)
case _ => sys.error("Undivisable numeric!")
}

所以,让我们做一些解释。一、 Numeric必须在类型类模式中使用。也就是说,你不说类型 T是或可以转换为 Numeric .相反, Numeric通过类型提供方法 T .一个这样的例子是 num.fromInt .

接下来, Numeric不提供通用除法运算符。相反,必须在 Fractional 之间进行选择和 Integral .在这里,我正在匹配 Numeric[T]来区分两者。

请注意,我不使用 T在匹配上,因为 Scala 无法检查匹配上的类型参数,因为它们被删除了。相反,我使用 _ ,如果可能,Scala 会推断出正确的类型(就像这里一样)。

之后,我正在导入 num._ ,其中 num要么是 FractionalIntegral .这给上下文带来了一些隐式转换,让我可以执行诸如调用方法 / 之类的事情。直接。如果我不做那个导入,我将被迫写这个:
num.div(xs.sum, num.fromInt(xs.size))

请注意,我不必将隐式参数传递给 xs.sum ,因为它已经在范围内隐式可用。

我想就是这样。我错过了什么吗?

关于scala - 在 Scala 中编写一个通用的均值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6188990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com