- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有下一个代码:
import zio._
import scala.concurrent.Future
case class AppError(description: String) extends Throwable
// legacy-code imitation
def method(x: Int): Task[Boolean] = {
Task.fromFuture { implicit ec => Future.successful(x == 0) }
}
def handler(input: Int): IO[AppError, Int] = {
for {
result <- method(input)
_ <- IO.fail(AppError("app error")).when(result)
} yield input
}
但是这段代码不能编译,因为编译器说结果类型是:
ZIO[Any, Throwable, Int]
如何从 Task(我调用 method
的地方)转换为 IO?
最佳答案
您需要决定要如何处理不是 AppError
的 Throwable
错误。
如果您决定要将它们映射到 AppError
,您可以执行以下操作:
method(input).mapError {
case ae: AppError => ae
case other => AppError(other.getMessage)
}
如果你想改进这些错误并且只保留那些 AppError
那么你可以使用 refine*
运算符家族之一,这将保留错误匹配谓词并终止纤程。
method(input).refineToOrDie[AppError] // IO[AppError, Boolean]
// Or
method(input).refineOrDie { case ae: AppError => ae } // IO[AppError, Boolean]
或者如果您想假设所有来自 method
的错误都被认为是“Fiber terminating”,那么您可以使用 .orDie
来吸收错误并终止 fiber:
method(input).orDie // UIO[Boolean]
或者如果你想从错误中恢复并以不同的方式处理它,那么你可以使用 catch*
系列
method(input).catchAll(_ => UIO.succeed(false)) // UIO[Boolean]
最后,如果您希望将结果映射到 Either
,您可以使用 .either
,这会将错误从错误 channel 中移除并将其映射到 任一[E, A]
method(input).either // UIO[Either[Throwable, Boolean]]
有一个很棒的备忘单(虽然有点过时了)here还有
关于zio - 将 ZIO 任务转换为 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62860131/
这可能是一个愚蠢的问题,但从 ZIO 开始,我无法将 Seq[ZIO] 转换为 ZIO[Seq]: def translate(keys: Seq[String], locales: Seq[Loca
我创建了我的服务的两个版本。第一个使用 Futures,另一个使用 ZIO 作为效果。 我有一个使用 Future 作为结果效果的简单方法: def get(id: String)(implicit
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有一个返回一些 ZIO 的方法: def method(...): ZIO[Any with clock, SomeError, Unit] 调用此方法返回Task[Unit]: def other
(希望)关于 Scalaz Zio 的简单问题。 我有一些重构为 Zio 的旧代码。我希望该代码的一条路径保持原样: 同步 阻塞 在当前线程上(这是一个硬性要求) 我如何运行 IO这样它的行为就像旧的
我正在使用 ZIO:https://github.com/zio/zio 在我的 build.sbt : "dev.zio" %% "zio" % "1.0.0-RC9" 无论我尝试过什么,每次我需要
我想为 abort-early-in-a-fold 添加一个答案对于ZIO。 所以我采用了猫的解决方案:cats solution def sumEvenNumbers(nums: Stream[In
我有一堆 IO,所有这些都可能成功或失败: val result: Seq[IO[MyFailure, MySuccess]] = ... 我需要总结结果,以便我可以一起检查所有失败和所有成功: ca
我在 Scala 中有一个类有四个参数,其中 2 个是变量,我想在 Zio 中使用 Ref 数据类型来控制对这些变量的访问,这是我的代码: import zio._ class Rectangle(v
我找不到有关如何使用 ZIO 测试忽略套件或测试的任何信息。 无论是在示例中还是在文档中( https://zio.dev/docs/usecases/usecases_testing ) 有一个ig
我知道ZIO是维护自己的堆栈,即zio.internal.FiberContext#stack ,它保护递归函数,如 def getNameFromUser(askForName: UIO[Strin
我想按顺序运行两个集成测试。如何在 ZIO Test 中实现这一点? 这是套房: suite("Undeploy a Package")( testM("There is a Package"
scala.js 是否与 scala ZIO 一起使用? 我想在 scala.js 中使用 scala ZIO 我只知道如何在普通应用程序中使用 scala ZIO 有谁知道如何在 scala.js
我有几个 Booleans我想测试,比如 assert(g8Exists, equalTo(true)) && assert(projectExists, equalTo(true)) && asse
我想在 ZIO Fibers 上使用组合器 orElse。 从文档: 如果第一个纤维成功,则合成的纤维将成功,其结果;否则,组成的光纤将以第二条光纤的退出值完成(无论成功或失败)。 import zi
我有以下 ZIO 程序,其中包含两个永久运行的进程: for { .. numberProvider <- numberProvider(queue).fork //
我试过了 assert(anOption)(contains("x")) 但这仅适用于 Iterables,例如 List 或 Seq。 最佳答案 assert(anOption)(isSome(eq
我有以下功能,我想测试: def people(id: Int): RIO[R, People] 如果有一个人,此函数将返回 id , 分别如果没有,则失败,例如: IO.fail(ServiceEx
我有一个严重的副作用函数(想想数据库调用),我想将其用作惰性值,这样它只会在第一次使用时被调用(如果从未使用过则根本不会被调用)。 我如何使用 ZIO 做到这一点? 如果我的程序看起来像这样,函数只被
我是一名优秀的程序员,十分优秀!