如何使用Scalaz的遍历和traverseU与Either

时间:2014-12-16 17:25:24

标签: scala scalaz

是否可以将Scalaz'traversetraverseUEither一起使用而不是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遍历f,如果有一个或多个失败,则返回第一个Right(msg);如果一切正常,则返回Left(list)

1 个答案:

答案 0 :(得分:4)

你有没有理由不使用scalaz ValidationNonEmptyList

您可以轻松地执行类似

的操作
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))

如果你想要在第一个错误上失败,你可以使用\/,即Either的scalaz版本,它与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))