【问题标题】:How make tail recursion in scala from Future.foreach call back?如何从 Future.foreach 回调的 scala 中进行尾递归?
【发布时间】:2015-09-10 03:42:30
【问题描述】:

考虑一个 scala 代码:

def myRecursiveFunction(id:string):Unit= {
    myAsyncDao.search(id).foreach {response=>
        myRecursiveFunction(response.id)
    }
}
//myAsyncDao.search returns a Future
//response have id field for further computations

如果我将 @tailrec 放在顶部 op 函数上,编译会报错 Recusive call not in tail position。

可以优化为尾递归吗?

【问题讨论】:

  • 如您所见in this answer,您的解决方案不需要尾递归,因为堆栈无论如何都不会增长。

标签: scala recursion callback future


【解决方案1】:

怎么样

def myRecursiveFunction(id:string):Future[Unit]= {
    myAsyncDao.search(id) flatMap {response=>
        myRecursiveFunction(response.id)
    }
}

更新:

def search(id: Future[Int]) = Future { 5 }

@tailrec
def myRecursiveFunction(id: Future[Int]):Future[Unit]= {
    val response = search(id)
    myRecursiveFunction(response)    
}

【讨论】:

  • 发帖前你有没有试过?它不起作用仍然是同样的错误。
  • 不幸的是,除了 OP 的 search 函数不采用 Future[Int] 而是采用 String 之外,这使情况更加复杂。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多