【发布时间】:2015-07-09 02:08:24
【问题描述】:
这个帖子让我知道了如何构建我的代码:Scala-way to handle conditions in for-comprehensions?
有问题的部分:
// First create the JSON
val resultFuture: Future[Either[Failure, JsResult]] = for {
userRes <- userDao.findUser(userId)
user <- userRes.withFailure(UserNotFound).right
authRes <- userDao.authenticate(user)
auth <- authRes.withFailure(NotAuthenticated).right
goodRes <- goodDao.findGood(goodId)
good <- goodRes.withFailure(GoodNotFound).right
checkedGood <- checkGood(user, good).right
} yield renderJson(Map("success" -> true)))
这是我不明白的行:
user <- userRes.withFailure(UserNotFound).right
authRes <- userDao.authenticate(user)
userRes.withFailure(UserNotFound).right 映射到 userDao.authenticate(user)。这将创建一个新的 Either,其右侧有一个 Future,对吗?
怎么可能
val resultFuture: Future[Either[Failure, JsResult]]
属于它的类型。我认为应该有另一个未来,而不是 JsResult。 谁能给我解释一下?
编辑:既然 cmbaxter 和 Arne Claassen 确认了这一点,那么新的问题是:我应该如何编写这段代码,这样它看起来才不会难看,而且干净且结构化?
【问题讨论】:
-
我同意这个答案有问题。正如已多次发布的那样,您不能在理解中混合类型。无论您从什么类型开始,都是您需要通过其余步骤传播的类型 (
flatMaps)。在这种情况下,因为findUser返回Future[Option[User]],所以Future成为您必须在其余步骤中继续使用的类型。您不能像此人在理解的第二步中所做的那样只切换到Either -
我自己有点困惑。通常,for 理解一次只对一种 Monad 起作用,在这里我们混合了产生
Futures 和Eithers 的函数。我无法解析原始示例
标签: scala dictionary future either