Как остановить выполнение в целях понимания, если Option is None с использованием IO котов? - PullRequest
0 голосов
/ 20 ноября 2018

Если я просто использую Option для понимания, все идет так, как ожидалось:

val a = Some(1)
val b = None
val c = Some(3)

val r = for {
  aa <- a
  bb <- b
  cc <- c
} yield aa + bb + cc

println(r) // None, because b is None

, но как добиться того же поведения, используя IO кошек?

import cats.effect.IO
// in reality this will be a methods with side effect
val a = Some(1)
val b = None
val c = Some(3)

val r = for {
  _ <- IO{println("a"); a}
  _ <- IO{println("b"); b} // want to stop execution here
  _ <- IO{println("c"); c}
} yield ()

r.unsafeRunSync()

В результате я получаюa b c, но я ожидаю только a b.

Возможно ли достичь?Это правильный способ сделать это?

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете сделать это с помощью монадных трансформаторов;в частности, вы захотите использовать OptionT[IO, T] здесь:

import cats.effect._
import cats.data.OptionT
import cats.implicits._
import cats.effect.IO

val a = Some(1)
val b = None
val c = Some(3)

val r = for {
  _ <- OptionT[IO, Int](IO {println("a"); a})
  _ <- OptionT[IO, Int](IO {println("b"); b})
  _ <- OptionT[IO, Int](IO {println("c"); c})
} yield ()

r.value.unsafeRunSync() 

Посмотреть в действии здесь .

...