如何在Scala中构成Either / Disjunction的未来

时间:2015-06-30 14:14:34

标签: scala future scalaz monad-transformers either

假设我有以下功能来组成:

 val mayFail1: Int => Error \/ Int          = ???
 val slowAndMayFail: Int => Error \/ String = ???
 val mayFail2: String => Error \/ Int       = ???
 val mayFail3: String => Error \/ Int       = ???

 val mayFail: Int => Error \/ Int = {x =>
   for {
     x1 <- mayFail1(x)
     s  <- slowAndMayFail(x1)
     x2 <- mayFail2(s)
     x3 <- mayFail3(x2)         
   } yield x3
 }

由于mayFail,函数slowAndMayFail很慢,所以我希望它返回Error \/ Int future

直截了当的方法可能是让slowAndMayFail返回scalaz.Future[Error\/Int]],让所有其他功能(mayFail1mayFail2等)返回Future[Error\/Int]]然后添加EitherT将它们组合在一起。

有意义吗?有更简单/更简单的解决方案吗?

我知道scalaz提供了Task,但我暂时坚持使用Future

0 个答案:

没有答案