gpt4 book ai didi

scala - 理解中的Future [Option [Boolean]]。简单吧?

转载 作者:行者123 更新时间:2023-12-04 04:53:22 24 4
gpt4 key购买 nike

假设我有:

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

如何在a理解中使用Future [Option [Boolean]]来提取或转换 bool 值?

注意:这是我目前有很多Future [Option [Boolean]]变量的问题的简化,我想将 一起使用,以进行理解。

最佳答案

真正的理解使它看起来应该可以正常工作,不是吗?但是,让我们考虑一下您的要求。

首先,请注意for取消嵌套:

for {xs <- List(List(5)); x <- xs} yield x

产生
List(5)

现在,甚至无需深入研究类型签名或废话,我们就可以考虑将 List替换为任意类型的 T,然后将其中包含的类型称为 A:
for { xs <- T(T(a: A)); x <- xs } yield x

我们应该得到一个
T[A]

返回(大概是我们放入的那个,但是类型实际上并没有向我们保证)。

好的,那怎么办
for { xs <- T(U(a: A)); x <- xs } yield x

?严格来说,这比两个事物具有相同嵌套的情况更为笼统。好吧,如果 TU都具有一个共同的父类(super class)型 S,那么我们可以将整个内容视为 S(S(a: A)),因此至少要取回 S。但是一般情况下呢?

底线是它取决于。例如,让我们考虑 T=FutureU=Option的情况。我们有以下可能性:
Success(Some(a))
Success(None)
Failure(t: Throwable)

现在,我们可以提出任何连贯的解包策略吗?如果我们将其解压缩为 Future,那么对于 A情况,您要使用哪种 Success(None)?您没有可退货的商品。同样,如果您尝试征服外部 Future,又怎么知道,而未以任何方式明确地向编译器说明,则 Failure应该映射到 None(如果确实应该映射-也许应该使用默认值!)。

因此,最重要的是,如果不指定每对 T[U[_]]应该发生的情况,通常就不能正确地做到这一点。 (我鼓励感兴趣的读者细读有关 monadsmonad transformers的教程。)

但是,有一种解决方法:如果您可以将 U显式转换为 T,或者将 T转换为 U,则可以利用解包功能。将 Option转换为 Future很容易,因此最简单的解决方案是
for { opt <- res; r <- Future(opt.get) } yield r

(只要让异常抛出 none.get)。另外,您也可以将 Future转换为 Option,方法略显丑陋。
for { opt <- res.value.flatMap(_.toOption); r <- opt } yield r

关于scala - 理解中的Future [Option [Boolean]]。简单吧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20895058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com