代码之家  ›  专栏  ›  技术社区  ›  Jelly

Scala:用于理解递归未来

  •  0
  • Jelly  · 技术社区  · 2 年前

    任务是实现返回未来的递归方法

    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)
    }
    

    由于这一部分(“else recursive(result::res,trument+1)”)代码失败,出现错误,因为它期望Future[Seq[result]],但实际上返回Future[Object]。

    据我所知,问题是屈服块内的表达式必须返回Seq[结果],以便将来由Monad进行后续包装。但“recursive(result::res,trument+1)”返回Future。因此,不是预期的Seq[结果]收益率,而是包含未来的[Seq[结果]]。

    有没有办法解决这个问题?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Dima    2 年前

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

    在这里,你并不需要a来理解,在我看来,没有a读起来会更好:

       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)  
       }
    

    如果你出于某种原因倾向于理解,你仍然可以使用它,只需要移动大部分 yield 中的子句 for :

        for {
           res <- retrieve()
           out <- if (res.size() + result.size() > 20) Future.successful(result:::res) 
                  else recursive (result:::res, attempt + 1) 
         } yield out
            
              
    
    推荐文章
    St.Antario  ·  理解对理解
    7 年前