我正在玩Scala(z)来学习函数式编程。
我有一个type的值,Future[List[Error \/ Double]]
并想将其转换为type Future[[List[Error] \/ List[Double]]
。
目标是将左和右归为一组。
我目前有以下内容:
val foo: Future[List[Error] \/ List[Double]] = {
for {
results <- resultsF
} yield
results.foldLeft(\/[List[Error], List[Double]])({
case (acc, v) if v.isRight => v :: \/-(acc)
case (acc, v) if v.isLeft => v :: -\/(acc)
})
}
但是,::
由于,我的累加器不是列表(从外部),因此我在上出现错误\/[List[Error], List[Double]]
。应该怎么做?
此功能在Haskell是partitionEithers
:[Either a b] -> ([a], [b])
。
(实际上Either [a] [b]
,您实际上并不需要,因为您描述中的文字,所以我想您要使用此功能,而不是。)
Scalaz并没有提供它。但是,它具有更一般的含义separate
:
/** Generalized version of Haskell's `partitionEithers` */
def separate[G[_, _], A, B](value: F[G[A, B]])(implicit G: Bifoldable[G]): (F[A], F[B])
基本上是哪个Bifoldable g, MonadPlus f => f (g a b) -> (f a), (f b)
。具体来说:[Either a b] -> ([a], [b])
。您可以在列表中(在g = \/
(或两者之一),f = List
)中简单地调用它。
实际上:
scala> import scalaz._, Scalaz._
scala> List(\/-(3), -\/("a")).separate
res1: (List[String], List[Int]) = (List(a),List(3))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句