gpt4 book ai didi

定义接受不同数字类型列表的函数的 Scala 方法

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

我有以下问题:我有一个函数,它以 List[Double] 作为参数,对列表的元素执行一些算术运算,然后返回结果。我希望该函数也接受 List[Int]。下面是一个例子:

def f(l: List[Double]) = {
var s = 0.0
for (i <- l)
s += i
s
}

val l1 = List(1.0, 2.0, 3.0)
val l2 = List(1, 2, 3)

println(f(l1))
println(f(l2))

当然,第二个 println 失败了,因为 f 需要 List[Double] 而不是 List[Int]。

还要注意 f 函数内总和的非 Scala 风格公式,以证明需要在函数本身内使用 0(或其他常量)(如果我对 Int 值求和,我必须将 s 初始化为 0 而不是 0.0.0。

哪个是让函数在 Double 和 Int 上工作的最佳方法(更少的代码)?

(我已经看到了一些关于 2.8 Numeric trait 的东西,但我不太确定如何使用它......)

谢谢大家的帮助。

最佳答案

使用 scala 2.8 并使用 Numeric 组合进行隐式转换,您的示例可以写为:

import Numeric._
def f[T](l: List[T])(implicit n: Numeric[T]):T = {
var s = n.zero
for (i <- l)
s = n.plus(s, i)
s
}

val l1 = List(1.0, 2.0, 3.0)
val l2 = List(1, 2, 3)

println(f(l1))
println(f(l2))

//or
def f2[T](l: List[T])(implicit n: Numeric[T]):T = {
import n._
var s = zero
for (i <- l)
s += i
s
}
println(f2(l1))
println(f2(l2))

现在另一个示例以更 Scala 的方式进行求和:
def sum[T](l:List[T])(implicit n: Numeric[T]):T = {
import n._
l.foldLeft(zero)(_ + _)
}

println(sum(l1))
println(sum(l2))

//or since 2.8 Seq include already a sum function
def sum[T](l:List[T])(implicit n: Numeric[T]):T = l.sum

println(sum(l1))
println(sum(l2))

关于定义接受不同数字类型列表的函数的 Scala 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2235332/

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