Monad变换器 - Scalaz - 将[Future [String \ / String]]列出到Future [String \ / String]

时间:2015-06-01 14:16:28

标签: scala future scalaz monad-transformers either

我想知道如何将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))。< / p>

但我不知道如何管理期货。 是否可以保持异步?

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,但没有使用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")
        }
}

它不像我希望的那样好,但似乎有效。 如果有人知道最好的方式......