【问题标题】:Implement Future.sequence for case class CanBuildFrom Traversable Iterator Sequence Monad为案例类 CanBuildFrom Traversable Iterator Sequence Monad 实现 Future.sequence
【发布时间】:2016-06-18 13:43:33
【问题描述】:

我有这个:

case class Sides[A](east: A, west: A)

我想把这个Sides[Future[Boolean]] 转换成这个Future[Sides[Boolean]]

如何使用Future.sequence

这是docs

def
sequence[A, M[X] <: TraversableOnce[X]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]]
 Permalink
Simple version of Future.traverse. Transforms a TraversableOnce[Future[A]] into a Future[TraversableOnce[A]]. Useful for reducing many Futures into a single Future

【问题讨论】:

  • 你需要实现Traverse[Sides]。不会是Future.sequence(没有这样的东西,没有运行Future),而是Sides.sequence
  • 如果你阅读sequence 的定义,你会看到def sequence[A, M[X] &lt;: TraversableOnce[X]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] 所以你的Sides 需要是TraversableOnce 的子类。
  • @mfirry 你能实现吗,我不能做CanBuildFrom 的事情。
  • 为什么要使用Future.sequence?如果您使用的是scala.concurrent.Future,则不会像这样工作:def sequenceSides[A](sides: Sides[Future[A]])(implicit exec: ExecutionContext): Future[Sides[A]] = for { east &lt;- sides.east; west &lt;- sides.west } yield Sides(east, west) ?
  • @Kolmar 我也有南北,我想要简洁的代码。

标签: scala scalability scalaz


【解决方案1】:

编辑:因为这个问题有scalaz 标签,我假设有问题的Future 来自scalaz。编辑完问题后,很明显 OP 考虑到了来自 Scala 标准库的Future


我正在扩展我的评论作为答案。对于Sides,您需要一个Traverse 实例,而不是Future。 (Future 不存在 Traverse 实例,除非您愿意急切地评估 Future。)

import scalaz.{Applicative, Traverse}
import scalaz.concurrent.Future
import scalaz.syntax.traverse._

case class Sides[A](east: A, west: A)

implicit def traverseSides: Traverse[Sides] = new Traverse[Sides] {
  def traverseImpl[G[_], A, B](s: Sides[A])(f: A => G[B])(implicit G: Applicative[G]): G[Sides[B]] =
    G.apply2(f(s.east), f(s.west))(Sides(_, _))
}

val sf: Sides[Future[Boolean]] = ???
vaf fs: Future[Sides[Boolean]] = sf.sequence

【讨论】:

  • 谢谢,这行得通,但是,Future sequence 并没有急切地评估我认为这就是我想要的。
  • @user3995789 关于我们谈论的是哪个 Future 存在误解。 stdlib 中的Future.sequence[A, M[_]] 使用M 的可遍历结构,而不是Future,因此与我所说的一致——Future 不能被遍历,除非你强制它进行评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2012-01-07
  • 2012-01-24
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多