2016-05-19 15 views
3

の将来のために、将来の論理和を変換するにはどうすればメソッドの結果があります。 val res: Future[Int] Xor Future[String] = getResult(x)

を、私はから私のユースケースを外挿することができませんでした、それを変換し、Future[Int Xor String]

としてそれを使用したいですherding cats blogと、モナド変圧器が適切な工具であるかどうかは不明ですが、traverseのようなものでしょうか?

Xor catsの中には、どんな選択肢もあります。 Scalaz \/またはstdlib Eitherも同様です(しかし、私はバイアスされた論理和を好むでしょうが)。

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 
import scalaz.std.scalaFuture._ 
import scalaz.{\/, Functor} 

val disj: Future[Int] \/ Future[String] = \/.right(Future.successful("foo")) 
Functor[Future].counzip(disj) 
// Future[Int \/ String] : Success(\/-(foo)) 

Scalazはまた、あなたの逆を与えるCozip型クラスがあります。

はScalazはFunctor.counzipを持っていますが、scalaz.syntax.functorにはcounzip我々は直接Functor[Future]でそれを呼び出す必要がありそうありませんあなた

答えて

9

bisequenceFBitraverseインスタンスを持っている(とGは応用的である)場合は、G[F[A, B]]F[G[A], G[B]]を回すことができ、FTraverseインスタンスを持っており、Gは応用的であるときにG[F[A]]F[G[A]]をオンにすることができます。

import cats.data.Xor, cats.std.future._, cats.syntax.bitraverse._ 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

def flip[A, B](x: Xor[Future[A], Future[B]]): Future[Xor[A, B]] = x.bisequence 

Bitraverseが少しScalazのZipまたはCozipのようなものです(言及:

猫はあなただけでこれを書くことができますので、(私はここでは0.6.0-M2を使用しています)at least a couple of versionsためBitraverse実装を提供してきましたもう一つの答えですが)、タプルや論理和だけでなく、(適切なセマンティクスを持っていると仮定して)2つの型引数を持つ型コンストラクタに対してインスタンスを定義できるという点でより一般的です。

+0

感謝トラヴィス、私のためにうまく動作します。私はここで何をしているのかよく理解してほしいです:) – kostja

+1

@kostja [Gitter room](https://gitter.im/typelevel/cats)には、質問にもっと多くの人が常に対話的に答えてくれる人がほとんどいます! –

+1

この場合、キーは「Traverse」と「sequence」から一般化されています。これらは少しシンプルでより広く適用できるので、それらを使用する方法に関する直感を構築することが役に立ちそうです。 –

3

ありがとうございました:F[A \/ B] => F[A] \/ F[B]。ただ、sequenceとして

+0

Peterに感謝します。それは働いた。 – kostja