相关疑难解决方法(0)

monad变换器是否适用于从服务中获取JSON?

我玩了!2用于Scala应用程序,需要从外部服务检索JSON格式的某些数据.

表演!框架允许通过将响应包装在Promise中来异步发出HTTP请求.Promise是一个monad,它包含了将来可用的值.

这很好,但在我的情况下,我从Web服务得到的是一个JSON字符串.我必须解析它,解析可能会失败.所以我必须包装我得到的任何东西Option.结果是我的许多方法都在返回Promise[Option[Whatever]].也就是说,类型的值Whatever可能稍后可用.

现在每当我必须操作这样的值时,我需要map两次.我想用以下方式处理这个问题:

  • 创建一个新类型,比如说Hope[A],包装一个Promise[Option[A]]
  • 定义相关的方法,如map(或者我应该使用foreach和继承某些集合特征?)和flatten
  • Promise[Option[A]]和之间提供隐式转换器Hope[A].

它很容易定义map- 两个仿函数的组合也是一个仿函数 - flatten在这种情况下可以明确地完成,或者在编写monad时Option.

但是我有限的理解是我不需要重新发明这些东西:monad变换器确实存在于这种情况下.或者,好吧,所以我认为 - 我从未使用过monad变换器 - 这就是问题的关键点:

在这种情况下可以使用monad变压器吗?我将如何实际使用它们?

monads scala monad-transformers playframework-2.0

18
推荐指数
1
解决办法
3190
查看次数

未来[选项[布尔]]用于理解..简单吧?

假设我有:

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 for-comprehension

8
推荐指数
3
解决办法
2657
查看次数

未来[选项[Future [Int]]]到未来[Option [Int]]

什么是Scala中最干净的方法,从转换Future[Option[Future[Int]]]Future[Option[Int]]?它甚至可能吗?

scala future

3
推荐指数
1
解决办法
1649
查看次数