首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过typelevel猫将`Either[Error,Option[ How [Error,Account]`转换为`Either[Error,Option[Account]]`?

如何通过typelevel猫将`Either[Error,Option[ How [Error,Account]`转换为`Either[Error,Option[Account]]`?
EN

Stack Overflow用户
提问于 2018-01-15 12:37:29
回答 2查看 712关注 0票数 5

我正在使用cats,想知道如何使用它来转换数据。

从…

代码语言:javascript
复制
val data = Either[Error, Option[Either[Error, Account]]]

代码语言:javascript
复制
val target: Either[Error, Option[Account]] = howToConvert(data)

如果发生任何Error,结果将是Left(error),并带有第一个出现的错误。

我现在可以这样做:

代码语言:javascript
复制
data match {
  case Left(e) => Left(e)
  case Right(Some(Right(y))) => Right(Some(y))
  case Right(Some(Left(e))) => Left(e)
  case Right(None) => Right(None)
}

但我在找一些简单的方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-15 16:53:01

要做到这一点,最简单的方法是对内部的Option执行sequence操作,这样您就可以获得一个Either[Error, Either[Error, Option[Account]]],然后将其展平。使用cat语法,这非常简单:

代码语言:javascript
复制
import cats.implicits._

val target: Either[Error, Option[Account]] =
  data.flatMap(_.sequence)

为了清楚起见,sequence将类型构造函数转换为“内向外”,这意味着内部的Option[Either[Error, Account]]被转换为Either[Error, Option[Account]]

票数 7
EN

Stack Overflow用户

发布于 2018-01-15 13:47:58

这里有一个“简单”的方法,它只假定偏向右的(Scala2.12)或cat的语法

代码语言:javascript
复制
val target: Either[Error, Option[Account]] =
    data.flatMap(_.map(_.map(Some(_))).getOrElse(Right(None)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48257004

复制
相关文章

相似问题

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