如何将 Scalaz 的 traverse 和 traverseU 与 Either 结合使用

2024-03-04

是否可以使用 Scalaz'traverse and traverseU with Either代替Option?

对于以下代码:

val list = List(1, 2, 3)

def f(i: Int): Either[Int, String] =
  if (i > 2) Left(i)
  else Right("must be lower than 3")

我想穿越list with f并返回第一个Right(msg)如果出现一个或多个失败,或者Left(list)如果一切顺利的话。


您有什么理由不使用Validation and NonEmptyList通过斯卡拉兹?

你可以轻松地做类似的事情

def f(i: Int) =
  if (i > 2) i.successNel
  else "something wrong".failureNel

List(1, 2, 3).traverseU(f) // Failure(NonEmptyList(something wrong, something wrong))
List(3, 4, 5).traverseU(f) // Success(List(3, 4, 5))

如果您想在第一个错误时失败,您可以使用\/,又名 scalaz 版本Either它同构于scala.Either但偏右

def f(i: Int) =
  if (i > 2) \/-(i)
  else -\/("something wrong")

List(1, 2, 3).traverseU(f) // Failure(something wrong)
List(3, 4, 5).traverseU(f) // Success(List(3, 4, 5))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Scalaz 的 traverse 和 traverseU 与 Either 结合使用 的相关文章

随机推荐