任務是實作遞回方法,回傳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)
}
并且由于這部分(“else recursive (result:::res, try 1)”)代碼失敗并出現錯誤,因為它期望 Future[Seq[Result]],但實際上回傳 Future[Object]。
據我了解,問題在于 yield-block 中的運算式必須回傳 Seq[Result] 以供 Monad 在 Future 中進行后續包裝。但是“遞回 (result:::res, try 1)”回傳 Future。因此,代替預期的 Seq[Result] 產量包含 Future[Seq[Result]]。
有什么辦法可以解決這個問題嗎?
uj5u.com熱心網友回復:
訣竅是將您在終端案例中回傳的值包裝到未來,以便型別匹配兩種情況。
你真的不需要在這里理解,沒有它IMO會更好讀:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485125.html
上一篇:系統呼叫讀取結果后顯示隨機字符
