【问题标题】:Monad transformers - Scalaz - List[Future[String\/String]] to Future[String\/String]Monad 转换器 - Scalaz - List[Future[String\/String]] 到 Future[String\/String]
【发布时间】:2015-08-15 01:17:22
【问题描述】:

我想知道如何将List[Future[String\/String]] 转换为Future[String\/String]

其实我只是想申请列表EitherT.apply的每个元素。

我想要的是这样的:

val result: EitherT[Future, String, String] =
    for{
        _                     <- EitherT.apply(fun(arg1))
        _                     <- EitherT.apply(fun(arg2))
        res                   <- EitherT.apply(fun(arg3))
    } yield res
result.run

// ...

def fun(arg1: MyType): Future[String\/String] = ...

在本例中,我想将函数 fun 和函数 fun 的参数列表(包含 n 个元素)设置为输入(此处为:List(arg1, arg2, arg3))。

但我不知道如何使用 Futures 进行管理。 是否可以保持异步?

【问题讨论】:

  • Future.sequence 可以做到。
  • 我认为你在输出类型中忘记了一些东西 - 你输入了 List 但你只得到了一个元素?
  • 谢谢! @GáborBakos Future.sequence 很好,但是表演呢? @lmm 事实上,我只想一个接一个地检查列表中fun foreach 元素的结果。如果一个返回左(失败)返回这个,否则返回 \/-("Ok")。我找到了一种方法。看我的回答。

标签: scala future scalaz monad-transformers either


【解决方案1】:

我找到了一种方法,但不使用 EitherT.apply。

def seqCheck(elements: List[Element]): Future[String\/String] = elements match {
    case element :: tail  =>
        fun(element) flatMap {
            case \/-(_) =>
                seqCheck(tail)
            case -\/(e) => Future{
                -\/(e)
            }
        }
    case Nil                =>
        Future {
            \/-("Ok")
        }
}

它没有我想要的那么好,但它似乎有效。 如果有人知道最好的方法...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2019-11-20
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多