是否有Future
的概念在Scala中无法失败?
我正在转换Future[Result]
,这可能会失败 - 因此我将Failure
和Success
同时处理成Future[Option[String]]
,并带有可选的错误消息从失败或成功状态。到目前为止,非常好。
现在,我想正式(即,在类型系统的帮助下)记住,这个未来将始终保持Success
并且我不需要处理故障情况将来
有没有聪明的方法来做到这一点?
答案 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
当然,在地图下并不确定。