gpt4 book ai didi

Scala 检查一个 Eithers 序列

转载 作者:行者123 更新时间:2023-12-04 00:10:45 26 4
gpt4 key购买 nike

我想在 Scala 中更新一个序列,我有这段代码:

def update(userId: Long): Either[String, Int] = {
Logins.findByUserId(userId) map {
logins: Login => update(login.id,
Seq(NamedParameter("random_date", "prefix-" + logins.randomDate)))
} match {
case sequence : Seq(Nil, Int) => sequence.foldLeft(Right(_) + Right(_))
case _ => Left("error.logins.update")
}
}

其中 findByUserId 返回一个 Seq[Logins]update 返回 Either[String, Int] 其中 Int 是更新的行数,String 将是错误的描述。

我想要实现的是,如果在更新列表时发生错误,则返回一个 String,或者返回一个包含更新行总数的 Int

代码不工作,我想我应该在 match 中做一些不同的事情,我不知道如何检查 Seq 中的每个元素Eithers 是一个 Right 值。

最佳答案

如果您愿意使用 Scalaz 或 Cats,您可以使用 traverse。使用 Scalaz 的示例:

import scalaz.std.either._
import scalaz.std.list._
import scalaz.syntax.traverse._

val logins = Seq(1, 2, 3)

val updateRight: Int => Either[String, Int] = Right(_)
val updateLeft: Int => Either[String, Int] = _ => Left("kaboom")

logins.toList.traverseU(updateLeft).map(_.sum) // Left(kaboom)
logins.toList.traverseU(updateRight).map(_.sum) // Right(6)

遍历登录给我们一个 Either[String, List[Int]],如果我们得到 List 的总和,我们就得到想要的 Either [字符串,整数]

  • 我们使用toList 因为没有Traverse Seq 的实例。
  • traversemapsequence 的组合。
  • 我们使用 traverseU 而不是 traverse 因为它为我们推断了一些类型(否则我们应该引入类型别名或类型 lambda)。
  • 因为我们导入了 scalaz.std.either._ 我们可以直接使用 map 而无需使用右投影 (.right.map) .

关于Scala 检查一个 Eithers 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36016272/

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