如果我只是在理解中使用 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()
查看实际效果 here .
关于scala - 如果使用 cats IO 选项为 None,如何停止 for-compression 的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53393458/