【问题标题】:Scala: Future, zip, and recoverScala:未来、压缩和恢复
【发布时间】:2014-07-06 11:16:56
【问题描述】:

以下代码按预期编译和工作...

def find1(selector: JsValue): Future[Seq[String]]
def find2(selector: JsValue): Future[Seq[String]]

find1(Json.obj("name" -> "Joe")) zip
find2(Json.obj("name" -> "Tim")) map { case (result1, result2) =>
  val result = result1 ++ result2
  ...
}

...但是如果我添加recover 来处理可能出现的此类错误...

find1(Json.obj("name" -> "Joe")) zip
find2(Json.obj("name" -> "Tim")) map { case (result1, result2) =>
  val result = result1 ++ result2
  ...
}.recover { case e =>
  ...
}

...我总是收到以下错误:

[error] /home/j3d/test/TestController.scala:558: missing parameter type for expanded function
[error] The argument types of an anonymous function must be fully known. (SLS 8.5)
[error] Expected type was: ?
[error]        find2(Json.obj("name" -> "Tim")) map { case (result1, result2) =>
[error]                                             ^
[error] one error found

我试着像这样指定result1result2 的类型...

find1(Json.obj("name" -> "Joe")) zip
find2(Json.obj("name" -> "Tim")) map { case (result1: Seq[String], result2: Seq[String]) =>
  val result = result1 ++ result2
  ...
}.recover { case e =>
  ...
}

...但没有任何变化,即它仅在没有recover 的情况下编译。我错过了什么吗?

【问题讨论】:

    标签: scala future


    【解决方案1】:

    始终使用运算符符号。

    find1(Json.obj("name" -> "Joe")) zip
    find2(Json.obj("name" -> "Tim")) map { case (result1, result2) =>
       val result = result1 ++ result2
       ...
    } recover { case e => // removed the '.' 
      ...
    }
    

    【讨论】:

    • 当然我们可以想出一个比“无点”更好的词来表示“调用没有点的方法”?这与 point-free 风格无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-04-15
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多