2017-09-27 3 views
1

나는과 같이 세 단계가 계산을 가지고 :두 개의 cats.effect.IO 모나드에 대해 비 엄격한 정렬을 어떻게 달성합니까?

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

내가 순차적 이해를 위해 간단한을 사용하여 그들을 함께 결합 할 수 있습니다 : 우리의 경우

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

, step3 모두 step1과에 따라 달라집니다 step2이므로 및 step2이 모두 완료 될 때까지 step3이 실행되는 것을 원하지 않습니다. 그러나 step1step2은 독립적입니다. step2step1이 완료 될 때까지 시작되지 않기 때문에 위의 내용은 약간 부족합니다. 이 독립성을 어떻게 표현합니까?

저는 scala.concurrent.Future.sequence과 같은 것을 찾고 있었는데, Seq[IO[A]]에서 IO[Seq[A]]으로 변환되었습니다. (IO[A], IO[B])에서 IO[(A, B)]으로 변환하는 것이 더 좋습니다. 이것을 달성 할 수있는 방법이 있습니까?

답변

0

나는 그것을 발견했다고 생각한다. 이것은 작동하는 것 같다 : (. IO[(Unit, Unit)] 반환)

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

편집 : 더욱 간결하게 다음 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

명시 적으로 고양이 효과 라이브러리가하는 상태 아니요은 동시성 또는 병렬 처리를 처리합니다.