首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ZIO任务转换为IO

将ZIO任务转换为IO
EN

Stack Overflow用户
提问于 2020-07-12 18:51:25
回答 1查看 867关注 0票数 2

我有下面的代码:

代码语言:javascript
复制
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)转换为IO?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 00:23:37

您需要决定如何处理非AppErrorThrowable错误。

如果您决定要将它们映射到AppError,您可以这样做:

代码语言:javascript
复制
method(input).mapError {
  case ae: AppError => ae
  case other =>        AppError(other.getMessage)
}

如果您想要细化这些错误并只保留那些为AppError的错误,那么您可以使用refine*运算符系列之一,它将保留与谓词匹配的错误,否则将终止纤程。

代码语言:javascript
复制
method(input).refineToOrDie[AppError] // IO[AppError, Boolean]
// Or
method(input).refineOrDie { case ae: AppError => ae } // IO[AppError, Boolean]

或者,如果您希望假设来自method的所有错误都被认为是“纤程终止”,那么您可以使用.orDie来吸收错误并终止纤程:

代码语言:javascript
复制
method(input).orDie // UIO[Boolean]

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

代码语言:javascript
复制
method(input).catchAll(_ => UIO.succeed(false)) // UIO[Boolean]

最后,如果希望将结果映射到Either中,可以使用.either,它会将错误从错误通道中删除并映射到Either[E, A]

代码语言:javascript
复制
method(input).either // UIO[Either[Throwable, Boolean]]

还有一个很棒的小抄(尽管无可否认有点过时),here

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62860131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档