我想知道如何在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)
    }
  }
}
但是,我希望此方法适用于具有可变数量参数的函数.这可能吗?
编辑:当函数没有列表时,有没有办法做到这一点,而是采用标准参数列表或者是咖喱?
这是一个非常好的问题!
您希望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))
(如果您无法弄清楚代码,请不要担心,了解如何使用Hoogle并从Haskell中窃取它)
您可以使用Scalaz执行此操作(通常它以a开头F[G[X]]并返回a G[F[X]],给定类型构造函数G并分别F具有Traverse和Applicative功能.
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
| 归档时间: | 
 | 
| 查看次数: | 202 次 | 
| 最近记录: |