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)
我对上面的代码不满意,因为它重复且难以阅读/维护.有没有更好的方法可以做到这一点?我试图通过模式匹配值来搜索如何组合函数,但没有找到任何工作.看起来我不知道正确的术语.
如果有更好的措辞,任何帮助将不胜感激,并随时更改标题.
谢谢之前:)
更简单的方法是预生成一系列参数元组:
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)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |