任务是实现递归方法,返回 Future
def recursive (result:List[Result], attempt: Int):Future[Seq[Result]] = attempt match {
case a if a < 3 => {
for {
res <- retrive()
} yield {
if ((result:::res).size > 20) res
else recursive (result:::res, attempt + 1)
}
}
case => Future(Seq.empty)
}
并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。
据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[Seq[Result]]。
它有什么办法可以解决这个问题吗?
诀窍是将在终端情况下返回的值包装到未来,以便两种情况下的类型都匹配。
在这里你真的不需要一个for-comprehension,在我看来没有它会读得更好:
retrieve.flatMap {
case r if r.size + result.size > 20 => Future.successful(result:::r) // you are not prepending result in your snippet, I think, it's a bug ...
case r => recursive (result:::r, attempt + 1)
}
如果您由于某种原因偏向于理解,您仍然可以使用它,只需要将大部分收益
子句移到 for
中:
for {
res <- retrieve()
out <- if (res.size() + result.size() > 20) Future.successful(result:::res)
else recursive (result:::res, attempt + 1)
} yield out
我有两个函数返回期货。我正试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中。 此方法有效: 然而,我对“如果”在那里不满意,似乎我应该能够使用地图。 但是当我尝试使用地图时: 我得到一个编译错误: 我尝试了一些变化,但没有发现任何有吸引力的工作。有人能提出更好的理解和/或解释我的第二个例子的错误吗? 下面是一个最小但完整的Scala 2.10可运行示例:
有没有可能实现这样的事情: 我希望清楚我的意图是什么。
Scala使用什么模式来处理这种情况: 你有很多未来(它们可以是任何东西,但为了举例…) 你有一个返回未来的函数 我想做这样的事情: 我想返回一个值,但是我在rent语句中调用foF,我会得到一个
Scala 函数 递归函数在函数式编程的语言中起着重要的作用。 Scala 同样支持递归函数。 递归函数意味着函数可以调用它本身。 以上实例使用递归函数来计算阶乘: object Test { def main(args: Array[String]) { for (i <- 1 to 10) println(i + " 的阶乘为: = " + factori
我试图更好地理解递归和return语句的工作方式。因此,我看的是一段代码,用来识别与给定项相关联的斐波那契数--在本例中是4。我很难理解else的说法。 我尝试使用Visualize Python检查每一步发生了什么,但当它碰到else语句时,我就迷路了。 它看起来像是取n的值,然后减去1,创建一个新的n值3,并返回到函数定义中。因此它似乎只是从else语句中的第一个函数返回值。然而,编写else
最初,我发布了一个问题“理解尾部递归向量- Q2)尾递归,这让我很难理解。我理解他们为什么需要尾递归,基本上他们用它来避免迭代,所以他们使用helper作为中间例程...所以他们可以避免将每次迭代放入堆栈...类似这样的东西。和letrec/lambda表达式,如下所示: 第Q2-2行:为什么这是“局部递归”“局部”对我来说是递归的中间例程。。。在这里中间意味着我的理解。。 [我的困惑]尾递归是不