如何将[错误,选项[可能[错误,帐户]]]改为“错误,选项[帐户]]`与类型级猫?

时间:2018-01-15 04:37:29

标签: 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)
}

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

2 个答案:

答案 0 :(得分:6)

执行此操作的最简单方法是sequence内部Option,以便获得Either[Error, Either[Error, Option[Account]]]然后展平它。 使用猫语法,这非常简单:

import cats.implicits._

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

为了澄清,sequence转换了一个类型构造函数" out out",意味着内部Option[Either[Error, Account]]变成Either[Error, Option[Account]]

答案 1 :(得分:1)

这是一个轻松的"只假设一个右偏的Either(Scala 2.12)或者猫#39;语法

val target: Either[Error, Option[Account]] =
    data.flatMap(_.map(_.map(Some(_))).getOrElse(Right(None)))