我如何「修復」這種反應,我想未來的[選項[F4]如何刪除期貨期權未來的許多層中
val f4Response: Future[Option[Future[Option[Future[F4]]]]] =
for {
f1Opt <- api.getF1() // Future[Option[F1]]
f2Opt <- if (f1Opt.isDefined) api.getF2(f1Opt.get.id) else Future.successful(None) // getF2 is Future[Option[F3]]
} yield {
for {
f1 <- f1Opt
f2 <- f2Opt
} yield {
for {
f3Opt <- api.getF3(f1.id, f2.id) // Future[Option[F3]]
} yield {
for {
f3 <- f3Opt
} yield {
api.insertF(f1, f2, f3) // Future[Option[F4]]
}
}
}
}
更新
我響應嘗試使用scalaz但我得到一個錯誤:
val result: Future[Option[f4]] = (
for {
f1 <- OptionT(api.getF1(..))
f2 <- OptionT(api.getF2(..))
f3 <- OptionT(api.getF3(f1.id, f2.id)
} yield api.getF4(f1, f2, f3)
).run
錯誤是:
[error] found : scala.concurrent.Future[Option[scala.concurrent.Future[F4]]]
[error] required: scala.concurrent.Future[Option[F4]]
另外,我不能在線路接入f1.id和f2.id:
f3 <- OptionT(api.getF3(f1.id, f2.id)
不Catz公司OptionT行爲相同scalaz OptionT? – Blankman
如果我嘗試用scalaz做這件事,我必須發出1)我不能做f1.id,f2.id來獲得f3 2)它返回Future [Option [Future [F4]]我將添加我我現在的問題幾乎是 – Blankman
,你只需要改變一些語法(例如'value' - >'run'),我將提供一個'scalaz'的例子...... –