当前位置: 首页 > 知识库问答 >
问题:

在Scala中不会失败的未来

百里弘致
2023-03-14

Scala中有没有不会失败的< code >未来这个概念?

我正在将可能失败的未来[结果]转换为未来[结果],因此我同时处理失败成功--到未来[选项[字符串]],并带有从失败或成功状态派生的可选错误消息。目前为止,一切都好。

现在的情况是,我想正式地(即在类型系统的帮助下)记住,这个未来将始终保持成功,并且我将来不需要处理失败案例。

有什么聪明的方法可以做到这一点吗?

共有2个答案

穆浩皛
2023-03-14

这不就是类型标记的作用吗?

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

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

商兴朝
2023-03-14

你不能“在类型系统的帮助下”这样做,因为类型系统没有办法保证< code>Future不会失败,即使你保证它不会失败。

考虑一下这个:

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

即使您要使任何进一步的转换不可能,一旦Future被声明为始终成功,这仍然没有帮助,因为异常处理程序(或您为将原始未来转换为“总是成功的一个”)可能会抛出。

更新:正如下面的评论所指出的,上面的代码片段是不正确的:的结果。映射恢复的结果不同。然而,这一点是站得住脚的。以下是正确的说明:

Future { doStuff }
  .recover { case _ => Seq.empty[String].head }
 类似资料:
  • 我正在寻找一种将任意长度的期货列表转换为期货列表的方法。我使用的是Playframework,所以最终,我真正想要的是一个<code>未来〔结果〕,但为了让事情更简单,让我们说<code>将来〔List[Int]]通常的方法是使用<code>Future.sequence(…) 例如,执行以下操作不起作用: 我希望能够将1和3从那里拉出来,而不是只得到异常。我尝试将来使用<code>。折叠,但这显

  • 在Scala中,未来可能会失败,这可以异步发现: 你将如何“翻译”成Clojure?我的阅读让我相信Clojure未来/promise模型没有Scala的强大,你不能就这样抓住失败。那么该怎么办呢? Scala的未来永远不需要被问到它的价值——当它好并准备好时,它会告诉你发生了什么(包括它是否失败——这是这个问题的关键)。这就是我所说的“异步”的意思。Scala的未来可以处于三种可能的状态之一——

  • 我有三个连续的未来,并在理解中使用 现在我有一个像List[Future[T]这样的未来列表,首先我使用这种方法将其转移到Future[List[T]](为什么这个未来列表到未来列表的转换编译和工作?)。然后我得到未来

  • 我用的是Scala 2.10,Akka 2.1和Play 2.1。当我向后端发送一个http请求时,我要求一个参与者计算一些东西。如果计算结果在超时之前返回,则返回计算结果,否则返回另一个字符串。请参阅下面的代码。 演员如下: 我的问题是,即使演员在超时之前完成,未来也不会“返回”任何内容,因此超时总是过期。我做错了什么?谢谢。

  • 我试图在我正在编写的脚本中测试错误处理。如果异步函数fetchBar失败,我将模式匹配失败案例,然后返回包含失败结果的成功未来。 然而,当我对这个流进行单元测试时,我在测试失败案例时遇到了麻烦。我在fetchBar上打了一个存根,以返回失败的future,如下所示。 但是我注意到fetchedBar返回的是成功而不是失败。为什么会这样,我如何存根fetchBar函数来创建一个失败的尝试?

  • 我用的是3.4.0版 我对YUI有一个奇怪的问题。测试断言。下面是一个示例: 当断言在事件的回调中时,它永远不会失败:(文档中没有提到这种情况... 也许我做错了什么,但是缺少文档很难确定... 更新 没有等待/恢复的示例:http://jsfiddle.net/op1ekun/Fgra6/2/ 和具有等待/恢复 http://jsfiddle.net/op1ekun/Fgra6/5/ 更新2 已