如何将'NonEmptyList [[错误,用户]]`转换为`与[错误,NonEmptyList [用户]]`?

时间:2018-01-14 14:05:59

标签: scala list scala-cats either

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

val data = NonEmptyList[Either[Error, User]]

val target: Either[Error, NonEmptyList[User]] = howToConvert(data)

1 个答案:

答案 0 :(得分:5)

通常,当您想要将类型构造函数内部转出时,您可能正在寻找sequence。如果您在Scala> = 2.11.9中启用-Ypartial-unification,则可以让编译器推断所有内容:

data.sequence

否则:

type EitherError[A] = Either[Error, A]
data.sequence[EitherError, User]

或者如果你有type lambda plugin

data.sequence[Either[Error, ?], User]

或者如果您没有该插件,但您不喜欢类型别名:

data.sequence[({type L[A] = Either[Error, A]})#L, User]

它将执行返回第一个错误的预期事情,或者如果没有错误则执行所有用户。如果我们假装用户是整数并且错误是字符串:

scala> import cats.data.NonEmptyList, cats.implicits._
import cats.data.NonEmptyList
import cats.implicits._

scala> val data: NonEmptyList[Either[Error, User]] = NonEmptyList.of(Right(2), Left("error1"), Right(4))
data: cats.data.NonEmptyList[Either[Error,User]] = NonEmptyList(Right(2), Left(error1), Right(4))

scala> data.sequence
res4: Either[Error,cats.data.NonEmptyList[User]] = Left(error1)