假设我有以下功能来组成:
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]]
,让所有其他功能(mayFail1
,mayFail2
等)返回Future[Error\/Int]]
然后添加EitherT
将它们组合在一起。
有意义吗?有更简单/更简单的解决方案吗?
我知道scalaz
提供了Task,但我暂时坚持使用Future
。