2015-06-24 27 views
1

考慮一個Scala代碼:如何從Future.foreach回調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頂部運算函數,編譯抱怨Recusive call not in tail position

它可以被優化爲尾遞歸嗎?

+2

正如你[這個答案]閱讀(http://stackoverflow.com/a/16986416/2522681)您的解決方案不要求尾部遞歸,因爲堆棧不會增長。 –

回答

0

如何

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

發佈之前,你甚至嘗試過嗎?它不起作用仍然是一樣的錯誤。 – curious

+0

不,我沒有。但現在我有一個更新和驗證。 –

+0

除了OP的'search'函數不使用'Future [Int]'而是'String',這使得情況更加複雜,不幸的是。 –