是否可以使用Scalaz'traverse
和traverseU
withEither
代替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)
。
有没有你为什么不使用任何的理由Validation
,并NonEmptyList
通过scalaz?
您可以轻松地执行类似的操作
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句