加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:14:04 所属栏目:安全 来源:网络整理
导读:我想知道如何在 Scala中编写一个方法,它接受一个函数f和一个参数列表args,其中每个arg是一个范围.假设我有三个参数(范围(0,2),范围(0,10)和范围(1,5)).然后我想用这三个参数的所有可能性迭代f. var sum = 0.0for (a - arg(0)) { for (b - arg(1)) { for (c -
我想知道如何在 Scala中编写一个方法,它接受一个函数f和一个参数列表args,其中每个arg是一个范围.假设我有三个参数(范围(0,2),范围(0,10)和范围(1,5)).然后我想用这三个参数的所有可能性迭代f.

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

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

编辑:当函数没有列表时,有没有办法做到这一点,而是采用标准参数列表或者是咖喱?

解决方法

这是一个非常好的问题!

您希望在任意大小的元素列表上按顺序运行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,List(4,5),List(7)))
res2: List[List[Int]] = List(List(1,4,7),List(1,5,List(2,7))

(如果你无法弄清楚代码,不要担心,学习如何使用Hoogle和steal it from Haskell)

您可以使用Scalaz执行此操作(通常它以F [G [X]]开头并返回G [F [X]],因为类型构造函数G和F分别具有Traverse和Applicative功能.

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> List(List(1,List(7)).sequence
res3: List[List[Int]] = List(List(1,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读