【发布时间】:2020-06-05 02:00:54
【问题描述】:
我有多个值 F[A] 可能会在完成评估时出现一些错误。如果发生错误,需要执行一些操作。如何为所有值执行处理程序,而不仅仅是发生错误的第一个值?
例如
import cats.implicits._
import cats.effect._
class Test[F[_]: Sync] {
def executeAllHandlers[A, B, C](fa: F[A], fb: F[B], fc: F[C]): F[(A, B, C)] =
for {
a <- fa
b <- fb
c <- fc
} yield (a, b, c)
}
object Test extends App{
val ioa: IO[Int] = IO.raiseError(new Error) onError {
case _ => IO(println("ioa"))
}
val iob: IO[String] = IO.raiseError(new Error) onError {
case _ => IO(println("iob"))
}
val ioc: IO[Double] = 2.5.pure[IO]
//prints ioa and fails with Error
new Test[IO].executeAllHandlers(ioa, iob, ioc).unsafeRunSync()
}
我想要实现的是为所有错误评估执行处理程序,在上述情况下是 ioa 和 iob 并因错误而失败(不管是哪一个)。
是否有可能在猫身上实现这样的目标?也许mtl 类型类在这里会有所帮助?
【问题讨论】:
-
IOshortcircuits 是flatMap失败。您需要明确跟踪您的错误,例如IO[Either[Error, A]然后合并所有错误,可能使用 Validated或并行类型类。 -
@LuisMiguelMejíaSuárez 看起来不错。
IO可以是attempted,谢谢。
标签: scala error-handling functional-programming scala-cats