繁体   English   中英

组成期货和期权

[英]Composing Futures and Options

我有四个类型ABCD ,类型Future[Option[A]]的初始值x和三个函数: f1: A => Option[B]f2: B => Future[Option[C]]f3: C => D

如何编写以x开头的for理解,其结果将得出Future[Option[D]]类型的值,该值将是三个函数的“组成”?

您可以为此使用monad变压器(来自Scalaz):

import scalaz.OptionT
import scalaz.std.option._
import scalaz.syntax.monad._
val result: Future[Option[D]] = (for {
  a <- OptionT(x)
  b <- OptionT(f1(a).point[Future])
  c <- OptionT(f2(b))
} yield f3(c)).run

您将需要一个monad实例作为Future scalaz-contrib中有一个。

这不一定是最好的解决方案,但这是我想出的。 我首先尝试找到一种可以使用的通用类型

type N[X, Y] = Option[X] => Future[Option[Y]]

...然后将f1f2f3转换为该通用类型。

val f1: (A => Option[B]) = ???
val f1N: N[A, B] = {
  case None => Future.successful(None)
  case Some(a) => Future.successful(f1(a))
}

val f2: (B => Future[Option[C]]) = ???
val f2N: N[B, C] = {
  case None => Future.successful(None)
  case Some(b) => f2(b)
}

val f3: C => D = ???
val f3N: N[C, D] = {
  case None => Future.successful(None)
  case Some(c) => Future.successful(Some(f3(c)))
}

现在,我已经创建了f1Nf2Nf3N ,可以将它们用于美观的理解中。

val y: Future[Option[D]] = for {
  aOpt <- x
  bOpt <- f1N(aOpt)
  cOpt <- f2N(bOpt)
  dOpt <- f3N(cOpt)
} yield dOpt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM