scala – 未来[选项[布尔]]用于理解..简单对吧?
假设我有:
val res:Future[Option[Boolean]] = Future(Some(true)) 我能做到: res.map(opt => opt.map(r => print(!r))) 我想对此的理解是: for { opt <- res r <- opt } yield (print(!r)) 但这不起作用!我收到一个错误,即: error: type mismatch; found : Option[Unit] required: scala.concurrent.Future[?] r <- opt 如何在for comprehension中使用Future [Option [Boolean]]来提取或转换布尔值? 注意:这是我目前使用许多Future [Option [Boolean]]变量的问题的简化,我想在for comprehension中一起使用. 解决方法
一个for-comprehension真的让它看起来应该都可以工作,不是吗?但是让我们考虑一下你的要求.
首先,请注意,对于un-nests: for {xs <- List(List(5)); x <- xs} yield x 产生 List(5) 现在,我们甚至没有进入类型签名或desugaring,我们可以考虑用一些任意类型T替换List,我们将调用包含的类型A: for { xs <- T(T(a: A)); x <- xs } yield x 我们应该得到一个 T[A] 回来(可能是我们放入的那个,但类型实际上并没有向我们承诺). 好的,但是呢 for { xs <- T(U(a: A)); x <- xs } yield x ?这比两个具有相同嵌套的情况更为一般.好吧,如果T和U都有一个共同的超类型S,那么我们只能将整个事物视为S(S(a:A)),所以我们至少会得到一个S.但是在一般情况下呢? 底线是它取决于.例如,让我们考虑T = Future,U = Option的情况.我们有以下可能性: Success(Some(a)) Success(None) Failure(t: Throwable) 现在,我们能否提出任何连贯的解缠政策?如果我们展开未来,那么你用什么A来成功(无)案例?您没有可用的返回.同样地,如果你试图征服外部的未来,你怎么知道,如果没有明确地以某种方式向编译器说明,应该将失败映射到无(如果确实应该 – 也许它应该是默认的!). 所以最重要的是,你不能正确地做到这一点,而不指定每对T [U [_]]应该发生什么. (我鼓励有兴趣的读者仔细阅读monads和monad transformers的教程.) 但是有一条出路:如果你可以明确地将你的U变成T,或者将你的T变成你的U,你可以利用展开功能.将选项转换为未来非常容易,因此最简单的解决方案是 for { opt <- res; r <- Future(opt.get) } yield r (只是让异常在none.get上抛出).或者,您可以将Future变成一个稍微丑陋的选项 for { opt <- res.value.flatMap(_.toOption); r <- opt } yield r (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |