如何用猫将 `NonEmptyList[Either[Error, User]]` 转换为 `Either[Error, NonEmptyList[User]]`?
How to convert a `NonEmptyList[Either[Error, User]]` to `Either[Error, NonEmptyList[User]]` with cats?
我正在使用cats,想知道如何用它转换数据:
val data = NonEmptyList[Either[Error, User]]
至
val target: Either[Error, NonEmptyList[User]] = howToConvert(data)
通常,当您想要将类型构造函数翻转过来时,您可能正在寻找 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)
我正在使用cats,想知道如何用它转换数据:
val data = NonEmptyList[Either[Error, User]]
至
val target: Either[Error, NonEmptyList[User]] = howToConvert(data)
通常,当您想要将类型构造函数翻转过来时,您可能正在寻找 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)