gpt4 book ai didi

scala - 具有保留类型的序列的任一到任一的通用序列

转载 作者:行者123 更新时间:2023-12-05 00:12:13 25 4
gpt4 key购买 nike

我想要一个可以转换任何可迭代类型的函数 C[_]Either[A, B]Either[C[A], C[B]] .

我让它工作了,但我使用了 asInstanceOf方法,我觉得这种方法在某些情况下可能会失败(我还不知道那会是什么场景,因为我不太了解 CanBuildFrom 解析)。

我认为我应该使用自定义 CanBuildFrom 来实现它但我希望有更简单的方法来做到这一点。

这是我的方法:

type IterableCollection[A[_], B] = A[B] with Iterable[B]

implicit class IterableEither[C[_], A, B](self: IterableCollection[C, Either[A, B]]) {
def accumulate: Either[IterableCollection[C, A], IterableCollection[C, B]] = {
val failures = self.collect { case x @ Left(_) => x.value }.asInstanceOf[IterableCollection[C, A]]

if (failures.nonEmpty) Left(failures)
else Right(self.collect { case x @ Right(_) => x.value }.asInstanceOf[IterableCollection[C, B]])
}
}

我已经用 Scala 编程了一段时间,但从未依赖过 asInstanceOf因此我有点害怕将这种代码引入生产环境。你们看到没有 Actor 的方法吗?

最佳答案

对于猫,这将是一个函数,它通过 Validated 遍历任何一个并返回到任何一个。转换为 Validated 的原因是序列需要 Applicative 实例。

import cats.Traverse
import cats.data.{NonEmptyList, ValidatedNel}
import cats.implicits._

def accSequence[T[_], A, B](tab: T[Either[A, B]])(implicit T: Traverse[T]): Either[NonEmptyList[A], T[B]] =
tab.traverse[ValidatedNel[A, ?], B](_.toValidatedNel).toEither

val result: Either[NonEmptyList[Int], List[String]] = accSequence(List(Left(1), Right("A"), Left(2)))

关于scala - 具有保留类型的序列的任一到任一的通用序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51467991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com