gpt4 book ai didi

scala - 选项[ future [选项[Int]]] => future [选项[Int]]

转载 作者:行者123 更新时间:2023-12-04 23:44:48 26 4
gpt4 key购买 nike

给定一个 Option[Future[Option[Int]]] :

scala> val x: Option[Future[Option[Int]]] = Some ( Future ( Some ( 10 ) ) )
x: Option[scala.concurrent.Future[Option[Int]]] =
Some(scala.concurrent.impl.Promise$DefaultPromise@446a1e84)

我要 Future[Option[Int]] .

我可以模式匹配(或使用 Option#getOrElse ):
scala> x match { 
| case Some(f) => f
| case None => Future { None }
| }
res6: scala.concurrent.Future[Option[Int]] =
scala.concurrent.impl.Promise$DefaultPromise@446a1e84

scala> res6.value
res7: Option[scala.util.Try[Option[Int]]] = Some(Success(Some(10)))

但是,是否有一个高阶函数可以完成这项工作?

我想过用 sequence ,但我没有 List 的外部类型:
> :t sequence
sequence :: Monad m => [m a] -> m [a]

最佳答案

Haskell 的 sequence不像 Scalaz 那样通用,也不像 Scalaz 那样通用(而且我假设您对 Scalaz 解决方案没问题,因为您提到了 sequence )。

斯卡拉兹 sequence (和 Haskell 的 sequenceA in Data.Traversable )只要求外部类型构造函数有一个 Traverse实例——它不一定是一个列表。 Option有一个 Traverse实例,所以 sequence在这里可以正常工作:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scalaz._, Scalaz._

def collapse(x: Option[Future[Option[Int]]]): Future[Option[Int]] =
x.sequence.map(_.flatten)

Scalaz 还提供了一个 orZero Option的扩展方法,这将允许您只写 x.orZero , 因为 Future[Option[Int]] 的零是 Future(None) .

我实际上可能会使用 x.getOrElse(Future.successful(None)) ,不过,在这种情况下,它的性能略高(可能无关紧要),但更重要的是,它与 Scalaz 选项一样清晰且几乎一样简洁。

关于scala - 选项[ future [选项[Int]]] => future [选项[Int]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364011/

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