我玩了!2用于Scala应用程序,需要从外部服务检索JSON格式的某些数据.
表演!框架允许通过将响应包装在Promise中来异步发出HTTP请求.Promise是一个monad,它包含了将来可用的值.
这很好,但在我的情况下,我从Web服务得到的是一个JSON字符串.我必须解析它,解析可能会失败.所以我必须包装我得到的任何东西Option.结果是我的许多方法都在返回Promise[Option[Whatever]].也就是说,类型的值Whatever可能稍后可用.
现在每当我必须操作这样的值时,我需要map两次.我想用以下方式处理这个问题:
Hope[A],包装一个Promise[Option[A]]map(或者我应该使用foreach和继承某些集合特征?)和flattenPromise[Option[A]]和之间提供隐式转换器Hope[A].它很容易定义map- 两个仿函数的组合也是一个仿函数 - flatten在这种情况下可以明确地完成,或者在编写monad时Option.
但是我有限的理解是我不需要重新发明这些东西:monad变换器确实存在于这种情况下.或者,好吧,所以我认为 - 我从未使用过monad变换器 - 这就是问题的关键点:
在这种情况下可以使用monad变压器吗?我将如何实际使用它们?
假设我有:
val res:Future[Option[Boolean]] = Future(Some(true))
Run Code Online (Sandbox Code Playgroud)
我能做到:
res.map(opt => opt.map(r => print(!r)))
Run Code Online (Sandbox Code Playgroud)
我想对此的理解是:
for {
opt <- res
r <- opt
} yield (print(!r))
Run Code Online (Sandbox Code Playgroud)
但这不起作用!我收到一个错误,即:
error: type mismatch;
found : Option[Unit]
required: scala.concurrent.Future[?]
r <- opt
Run Code Online (Sandbox Code Playgroud)
如何在for comprehension中使用Future [Option [Boolean]]来提取或转换布尔值?
注意:这是我目前使用许多Future [Option [Boolean]]变量的问题的简化,我想在for comprehension中一起使用它们.
什么是Scala中最干净的方法,从转换Future[Option[Future[Int]]]到Future[Option[Int]]?它甚至可能吗?