[英]Convert a ValidationNel[A, List[B]] into ValidationNel[A, NonEmptyList[B]]
我已经编写了一个组合器,用于将ValidationNel[A, List[B]]
转换为ValidationNel[A, NonEmptyList[B]]
,当List
为空时会返回Failure
。
def nonEmpty[A, B](valid : ValidationNel[A, List[B]], fail : => A) : ValidationNel[A, NonEmptyList[B]] =
valid match {
case Failure(f) => f.failure[NonEmptyList[B]]
case Success(s) =>
if (!s.isEmpty) NonEmptyList(s.head, s.tail:_*).successNel[A]
else fail.failureNel[NonEmptyList[B]]
}
有没有更好的办法 ?
我们可以通过两种方式来改善您的nonEmpty
函数:
toNel
将List
转换为Option[NonEmptyList]
。 ValidationNel
上的模式匹配类似于flatMap
,但是Validation
没有flatMap
操作,因为它是一个Applicative而不是Monad 。 Scalaz提供了一些简单的函数来在Validation
和\\/
之间进行转换(也称为析取),因此我们可以使用\\/
的flatMap
。 然后,您的nonEmpty
函数可能类似于:
import scalaz.{ValidationNel, NonEmptyList}
import scalaz.syntax.std.list._
import scalaz.syntax.std.option._
import scalaz.syntax.nel._
def nonEmpty[A, B](valid: ValidationNel[A, List[B]],
fail: => A): ValidationNel[A, NonEmptyList[B]] =
valid.disjunction.flatMap(_.toNel toRightDisjunction fail.wrapNel).validation
您可以将其用作:
import scalaz.syntax.validation._
nonEmpty(List(1,2).success, "test")
// scalaz.ValidationNel[String,scalaz.NonEmptyList[Int]] =
// Success(NonEmptyList(1, 2))
nonEmpty(List().success, "list is empty")
// scalaz.ValidationNel[String,scalaz.NonEmptyList[Nothing]] =
// Failure(NonEmptyList(list is empty))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.