繁体   English   中英

将ValidationNel [A,List [B]]转换为ValidationNel [A,NonEmptyList [B]]

[英]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函数:

  • Scalaz可以使用toNelList转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM