scala - 如何使用类型级别的猫将 `Either[Error, Option[Either[Error, Account]]]` 转换为 `Either[Error, Option[Account]]`?

标签 scala option scala-cats either

我正在使用 cats ,想知道怎么用它转一个数据。


val data = Either[Error, Option[Either[Error, Account]]]


val target: Either[Error, Option[Account]] = howToConvert(data)

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

我现在可以这样做:
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)
}

但我正在寻找一些简单的方法

最佳答案

最简单的方法是sequenceOption ,这样你就会得到一个 Either[Error, Either[Error, Option[Account]]]然后将其压平。
使用猫语法,这真的很容易:

import cats.implicits._

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

澄清一下,sequence将类型构造函数“由内而外”,意味着内部 Option[Either[Error, Account]]变成了 Either[Error, Option[Account]] .

关于scala - 如何使用类型级别的猫将 `Either[Error, Option[Either[Error, Account]]]` 转换为 `Either[Error, Option[Account]]`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48257004/

相关文章:

scala - 如何将数据集转换为 Scala Iterable?

javascript - 一起使用Select Option和If语句可更改背景色

scala - 如何正确编写可能失败的foldLeft函数?

Scala with Cats - 笛卡尔 + 验证

scala - Scala 中 Java 反射的类型安全用法

java - 为什么弃用警告会导致 SBT 中出现编译错误

Scalameta Decl.Def 不适用于 trait def 方法

string - 如何在scala中比较两个字符串?

scala - 在语句中混合 Scala Option 和常规变量

带有图像的jQuery多选选项