是否有任何理由使用Future [Try [A]]而不是Future [A]类型的API?

时间:2015-01-25 16:16:48

标签: scala monads

考虑到Future结果上的任何模式匹配都匹配Success[A]Failure[A]onComplete()andThen())(因为他们期望{{1}作为一个参数,直接或通过部分函数),是否有一种情况,我想明确说明函数是Try[A]类型?

2 个答案:

答案 0 :(得分:7)

Scala中有各种构造,其中包含 failure 案例。有OptionEitherTryFuture。 (Future的主要观点是抽象异步操作,错误处理是为了方便起见。 Scalaz还有更多:ValidationDisjunctionMaybe更好EitherOption)。

他们都对错误的价值观有所不同。然而,TryFuture非常相似,都包裹Throwable。所以恕我直言Future[Try[A]]不会添加太多信息(关于错误)。与拥有Future[Future[A]]Try[Try[A]]相比。 OTOH Future[Option[A]]Future[Either[MyError, A]]对我有意义。


可能会有一个坐在你身边的地方,例如可能会失败f: A => Bg: B => C,你想避免在ExecutionContext中创建太多任务:

val a: Future[A] = ???
val c: Future[C] = a.map(f).map(g) // two tasks, not good
val c2: Future[Try[C]] = a.map(x => Try { f(x) } map g ) // one task, maybe better

// get will throw, but exception will be catched by Future's map
// Almost no information is lost compared to `c2`
// You cannot anymore distinguish between possible error in `a`
// and exceptions thrown by `f` or `g`.
val c3: Future[C] = a.map(x => Try { f (x) }.map(g).get)

在这种情况下,我宁愿重构fg以获得更好的类型,至少:f: A => Option[B]g: B => Option[C]然后,以Future[Option[C]]结束。

答案 1 :(得分:6)

Try[A]表示可能失败的同步计算。

Future[A]表示可能失败的异步计算。

在此定义下,Future[Try[A]]表示在异步计算(可能失败)内执行的同步计算(可能失败)的结果。

有意义吗?不是我,但我愿意接受创造性的解释。