在Scala中不能失败的未来

时间:2016-03-18 12:20:28

标签: scala future

是否有Future的概念在Scala中无法失败?

我正在转换Future[Result],这可能会失败 - 因此我将FailureSuccess同时处理成Future[Option[String]],并带有可选的错误消息从失败或成功状态。到目前为止,非常好。

现在,我想正式(即,在类型系统的帮助下)记住,这个未来将始终保持Success并且我不需要处理故障情况将来

有没有聪明的方法来做到这一点?

2 个答案:

答案 0 :(得分:6)

你不能“在类型系统的帮助下”这样做,因为类型系统无法保证Future不会失败,即使你保证不会失败。

考虑一下:

 Future { doStuff(); }
   .recover { case _ => "Failed!" } // Now it always succeeds
   .map { _ => Seq.empty[String].head }  // Now it does not. 

即使您要进行任何进一步的转换,一旦声明Future总是成功,那仍然无济于事,因为异常处理程序(或者您将原始未来转换为可能会抛出“永远成功的”。

更新:如下面的评论所述,上面的代码段不正确:.map的结果与Future的结果不同.recover 1}}。然而,重点是。这是正确的插图:

Future { doStuff }
  .recover { case _ => Seq.empty[String].head }

答案 1 :(得分:3)

这不是类型标记的用途吗?

scala> type Tagged[U] = { type Tag = U }
defined type alias Tagged

scala> type @@[T, U] = T with Tagged[U]
defined type alias $at$at

scala> trait OK ; trait Uncertain
defined trait OK
defined trait Uncertain

scala> type Sure[A] = Future[A] @@ OK
defined type alias Sure

scala> type Unsure[A] = Future[A] @@ Uncertain
defined type alias Unsure

scala> val f = Future.successful(42).asInstanceOf[Sure[Int]]
f: Sure[Int] = Future(Success(42))

然后

scala> object X { def p(f: Sure[_]) = "sure" ; def p(f: Unsure[_])(implicit d: DummyImplicit) = "unsure" }
defined object X

scala> X.p(f)
res1: String = sure

当然,在地图下并不确定。