将 ZIO 任务转换为 IO

2024-01-04

我有下一个代码:

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]

如何从任务转换(我称之为method) to IO?


你需要决定你想做什么Throwable错误不是AppError.

如果您决定要将它们映射到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被视为“光纤端接”,那么您可以使用.orDie吸收误差并杀死纤维:

method(input).orDie // UIO[Boolean]

或者,如果您想从错误中恢复并以不同的方式处理它,那么您可以使用catch* family

method(input).catchAll(_ => UIO.succeed(false)) // UIO[Boolean]

最后,如果您想将结果映射到Either你可以用.either,这会将错误从错误通道中取出并将其映射到Either[E, A]

method(input).either // UIO[Either[Throwable, Boolean]]

有一个很棒的备忘单(尽管无可否认有点过时了)here https://github.com/ghostdogpr/zio-cheatsheet as well

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ZIO 任务转换为 IO 的相关文章

  • 简单的scala宏

    我想要一个 scala 宏来执行以下操作 当我写的时候 myCreateCityMacro paris myCreateCityMacro vallorbe 我想得到 val paris new City paris val vallorb
  • Telerik RadGrid 在编辑模式下将 BoundColumn 设置为 ReadOnly

    我有一个 Telerik RadGrid 它具有三个绑定列和一个按钮列 我想让用户仅编辑绑定列之一中的值 用户可以添加新记录 因此我无法将两个绑定列设置为只读 无论如何 我可以在 ASPX 中执行此操作还是必须在后面的代码中执行此操作 我有
  • 使用 webpack 2 分割“vendor”块

    我有类似于官方的代码分割配置docs https webpack js org guides code splitting libraries manifest file一切都很完美 我的所有节点模块都在 供应商 块中 包括 babel p
  • request_threaded_irq()在驱动程序中使用,为什么不使用request_irq()?两者有什么区别?

    我发布了这是讨论 request threaded irq 的线程 但我没有得到任何回复 所以我新鲜发布它 我正在开发电容式触摸屏的触摸屏驱动程序 它使用 request threaded irq 调用而不是 request irq 我无法
  • 水平滚动到锚点

    我有一个水平导航的网站 这是代码 ul li a href box 1 a li li a href box 2 a li li a href box 3 a li li a href box 4 a li li a href box 5
  • ggplot箱线图+填充+颜色布鲁尔光谱

    我似乎无法fill使用 color Brewer 绘制连续值的箱线图 我知道它一定只是某个地方的简单语法交换 因为我可以根据连续值调整框的轮廓 这是我正在使用的数据 data lt data frame value sample 1 50
  • Keycloak v.18:如何使用 Keycloak API 与用户进行操作

    我试图获取并更改某些特定用户 姓名 电子邮件等 但我的链接返回一些未知错误 这是我的链接 http localhost 8080 admin realms space realm users 你能解释一下我做错了什么吗 将不胜感激 This
  • 在我的网站上流式传输音频

    我对在我的网站上流式传输音频感兴趣 但我不知道从哪里开始 我希望实现两种类型的流媒体 第一个是流式传输服务器上存储的歌曲播放列表 第二个是实时音频流 谁能推荐一些好的网站或插件来使用 声音管理器2 http www schillmania
  • 如何打开 STDIN/STDOUT 句柄并正确使用 utf8 编码?

    我的代码中有 utf8 字符 所以我这样做 use utf8 my line 382 I 03 02 2020 print line Wide character in print at 然后我想我的 STDOUT 应该在utf8 use
  • 如何使用 T32_WriteMemory 函数将值写入 python 中的内存地址

    我正在尝试使用 python 自动化 Trace32 函数 我正在尝试使用 T32 WriteMemory 函数将值写入内存地址 有人可以帮助我如何继续使用此功能吗 以下是 T32 Api pdf api remote pdf 的参考 in
  • 如何获取express.js中请求查询参数的数量?

    目前我必须单独检查每个可能存在的参数 if req query param1 undefined if req query param2 undefined if req query param3 undefined 获取所有查询参数 Ob
  • 关于 ADC,-1 (0xFFFFFFFF) 有什么特别之处吗?

    在我的一个研究项目中 我正在编写 C 代码 然而 生成的程序集是该项目的关键点之一 C 不提供对标志操作指令的直接访问 特别是ADC但这不应该是一个问题 只要编译器足够聪明来使用它 考虑 constexpr unsigned X 0 uns
  • Hadoop安装:Namenode无法启动

    目前我正在尝试在我的 ubuntu 14 10 32 位 utopic 上安装 hadoop 2 6 0 我按照这里的说明进行操作 http www itzgeek com how tos linux ubuntu how tos inst

随机推荐