我如何“修复”这种反应,我想未来的[选项[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'的例子...... –