gpt4 book ai didi

scala - 验证具有可变参数的概率分布总和为 1

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

我想知道如何在 Scala 中编写一个采用函数 f 的方法和参数列表args其中每个 arg 是一个范围。假设我有三个参数( Range(0,2)Range(0,10)Range(1, 5) )。然后我想遍历 f与这三个论点的所有可能性。

var sum = 0.0
for (a <- arg(0)) {
for (b <- arg(1)) {
for (c <- arg(2)) {
sum += f(a, b, c)
}
}
}

但是,我希望此方法适用于具有可变数量参数的函数。这可能吗?

编辑:当函数不采用列表,而是采用标准参数列表或被 curry 时,有什么方法可以做到这一点?

最佳答案

这真是一个好问题!

你想运行flatMap依次遍历任意大小的元素列表。当你不知道你的列表有多长时,你可以用递归来处理它,或者等效地用折叠来处理它。

scala> def sequence[A](lss: List[List[A]]) = lss.foldRight(List(List[A]())) {
| (m, n) => for (x <- m; xs <- n) yield x :: xs
| }
scala> sequence(List(List(1, 2), List(4, 5), List(7)))
res2: List[List[Int]] = List(List(1, 4, 7), List(1, 5, 7), List(2, 4, 7), List(2
, 5, 7))

(如果你不知道代码,别着急,学习如何使用 Hooglesteal it from Haskell )

您可以使用 Scalaz 执行此操作(通常它以 F[G[X]] 开头并返回 G[F[X]] ,因为类型构造函数 GF 分别具有 TraverseApplicative 功能。
scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> List(List(1, 2), List(4, 5), List(7)).sequence
res3: List[List[Int]] = List(List(1, 4, 7), List(1, 5, 7), List(2, 4, 7), List(2
, 5, 7))

scala> Seq(some(1), some(2)).sequence
res4: Option[Seq[Int]] = Some(List(1, 2))

scala> Seq(some(1), none[Int]).sequence
res5: Option[Seq[Int]] = None

关于scala - 验证具有可变参数的概率分布总和为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716203/

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