gpt4 book ai didi

scala - 如何从元组中收集 Either 的左值?

转载 作者:行者123 更新时间:2023-12-02 18:21:45 24 4
gpt4 key购买 nike

对一堆类型为 Either[String, A] (其中 A 不止一种类型)的 Either 进行匹配后,我想将左侧的所有字符串累积到一个列表中。

(a, b, c, d, e) match {
case (Right(a), Right(b), Right(c), Right(d), Right(e)) => {
"All good, use a, b, c, d, and e!"
}
case anythingElse => {
val strings = accLefts(anythingElse)
doSomethingWithStrings(strings)
}
}

如果我尝试 .productIterator.toList 元组,我最终会得到 List[Any]。如果我单独处理每个失败的案例(左右组合),我最终会得到指数数量的案例陈述。

如何在末尾获得一个 List[Either[String, Any]] 传递给我的 accLefts 调用?或者我应该做一些比赛以外的事情?

最佳答案

这正是 ScalazValidationNEL 的类型。 (本质上是一个增强的Either)旨在支持。例如,假设我们使用 Scalaz 7 进行以下设置:

import scalaz._, Scalaz._

case class Person(first: String, last: String, initial: Char, age: Int)

val first = "John".successNel[String]

val last = "Doe".successNel[String]
val badLast = "Empty last name".failureNel[String]

val initial = 'H'.successNel[String]
val badInitial = "Non-alphabetic MI".failureNel[Char]

val age = 45.successNel[String]
val badAge = "Negative age provided".failureNel[Int]

请注意,这里的 Nel 代表非空列表,而 "John".successNel[String] 或多或少是相当于 Right("John"): Either[List[String], String]

现在我们可以编写以下内容:

scala> println((first |@| last |@| initial |@| age)(Person.apply))
Success(Person(John,Doe,H,45))

或者:

scala> println((first |@| badLast |@| initial |@| badAge)(Person.apply))
Failure(NonEmptyList(Empty last name, Negative age provided))

或者:

scala> println((first |@| badLast |@| badInitial |@| badAge)(Person.apply))
Failure(NonEmptyList(Empty last name, Non-alphabetic MI, Negative age provided))

任何错误都会累积在 ValidationNEL 的左侧。参见例如我的回答here了解更多详情。

关于scala - 如何从元组中收集 Either 的左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166159/

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