当前位置: 首页 > 知识库问答 >
问题:

Scala:用于理解递归未来

欧阳声
2023-03-14

任务是实现递归方法,返回 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]]。

它有什么办法可以解决这个问题吗?

共有1个答案

唐博文
2023-03-14

诀窍是将在终端情况下返回的值包装到未来,以便两种情况下的类型都匹配。

在这里你真的不需要一个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行:为什么这是“局部递归”“局部”对我来说是递归的中间例程。。。在这里中间意味着我的理解。。 [我的困惑]尾递归是不