如果Option为None,如何使用cats IO在中停止执行以进行理解



如果我只是在中使用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

但是如何使用cats 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

有可能实现吗?这样做对吗?

您可以使用monad转换器来完成此操作;具体来说,您需要在此处使用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() 

请在此处查看它的实际操作。

相关内容

最新更新