是否可以将Scalaz'traverse
和traverseU
与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
遍历f
,如果有一个或多个失败,则返回第一个Right(msg)
;如果一切正常,则返回Left(list)
。
答案 0 :(得分:4)
你有没有理由不使用scalaz Validation
和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))
如果你想要在第一个错误上失败,你可以使用\/
,即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))