2015-12-22 56 views
0

我已经写了组合子转换一个ValidationNel[A, List[B]]ValidationNel[A, NonEmptyList[B]]一个返回FailureList是空的。转换一个ValidationNel [A,列表[B]]到ValidationNel [A,NonEmptyList [B]]

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]] 
    } 

有没有更好的方法?

回答

2

我们可以改善您的nonEmpty功能有两种方式:

  • Scalaz可以使用 toNelListOption[NonEmptyList]
  • ValidationNel你的模式匹配类似于flatMap,但Validation没有flatMap操作,因为它是一个应用型而不是单子。斯卡拉兹提供了一些简单的功能,可以在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)) 
+0

从其中隐含了'wrapNel'从何而来?我有这个编译错误:'value wrapNel不是类型参数A的成员' –

+0

'scalaz.syntax.nel._' –

+0

了解它。看来这个导入'scalaz.syntax.all._'有冲突 –

相关问题