Scala中的模式匹配函数调用

ber*_*zie 0 functional-programming scala

我最初在CodeReview上发布了这个问题,但它似乎并不适合.我会在这里重新开始.请告诉我它是否也适合这里,我应该在哪里发布这类问题.谢谢.

我是Scala和函数式编程的新手.我想多次调用一个函数,并结合基于两个变量的参数.基本上,我现在正在做的是:

def someFunction(a: Int, b: Int): Future[Int] = ???

val value1 = true
val value2 = false

(value1, value2) match {
    case (true, true) =>
        val res1 = someFunction(0, 0)
        val res2 = someFunction(0, 1)
        val res3 = someFunction(1, 0)
        val res4 = someFunction(1, 1)

        for {
            r1 <- res1
            r2 <- res2
            r3 <- res3
            r4 <- res4
        } yield r1 + r2 + r3 + r4

    case (true, false) =>
        val res1 = someFunction(0, 0)
        val res2 = someFunction(1, 0)

        for {
            r1 <- res1
            r2 <- res2
        } yield r1 + r2

    case (false, true) =>
        val res1 = someFunction(0, 0)
        val res2 = someFunction(0, 1)

        for {
            r1 <- res1
            r2 <- res2
        } yield r1 + r2

    case (false, false) =>
        for { r1 <- someFunction(0, 0) } yield r1
}
Run Code Online (Sandbox Code Playgroud)

我对上面的代码不满意,因为它重复且难以阅读/维护.有没有更好的方法可以做到这一点?我试图通过模式匹配值来搜索如何组合函数,但没有找到任何工作.看起来我不知道正确的术语.

如果有更好的措辞,任何帮助将不胜感激,并随时更改标题.

谢谢之前:)

Kol*_*mar 5

更简单的方法是预生成一系列参数元组:

val arguments = for {
  arg1 <- 0 to (if (value1) 1 else 0)
  arg2 <- 0 to (if (value2) 1 else 0)
} yield (arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在参数上组合函数执行Future.traverse以获取Future结果序列,然后sum结果:

Future.traverse(arguments)(Function.tupled(someFunction)).map(_.sum)
Run Code Online (Sandbox Code Playgroud)