2017-09-27 7 views
1

私はそうのように、3つのステップを持っている計算を持っている:、2つのcats.effect.IOモナドに対して非厳密な順序付けを行うにはどうすればよいですか?

val c: IO[Unit] = for { 
    _ <- step1 
    _ <- step2 
    _ <- step3 
} yield() 

我々のケースでstep3は、両方のstep1に依存し:

import cats.effect.IO 
def step1: IO[Unit] = ??? 
def step2: IO[Unit] = ??? 
def step3: IO[Unit] = ??? 

私が理解するための単純なを使用して順次それらを一緒に組み合わせることができますstep2ですので、とstep2の両方が完了するまでstep3を実行したくありません。しかし、step1step2は独立しています。 step2step1が完了するまで開始されないため、上記の理解は少し不十分です。この独立性をどのように表現するのですか?

私はscala.concurrent.Future.sequenceのようなものを探していましたが、これはSeq[IO[A]]からIO[Seq[A]]に変換されます。 (IO[A], IO[B])からIO[(A, B)]に変換するものがさらに優れています。これを達成する方法はありますか?

答えて

0

私はそれを見つけたと思う。これが動作しているようです:

implicitly[cats.Cartesian[IO]].product(step1, step2) 

IO[(Unit, Unit)]を返します。)

EDIT:でも、もっと簡潔に:third paragraph of the README

import cats.implicits._ 
step1.product(step2) 
+0

'cats.Cartesian [IO] .product(step1、step2)' –

+0

と同様に簡潔に書かれており、 'cats.Applicative [IO] .sequence'も同様です。 'Seq [IO] 'を' IO [Seq [A]]に変換します。 –

0

それが明示的に猫効果ライブラリがないと述べていますではないは並行性または並列性を処理します。

関連する問題