Validation Scalaz验证和ApplicationBuilder限制

Validation Scalaz验证和ApplicationBuilder限制,validation,scala,scalaz,Validation,Scala,Scalaz,我们在项目中使用scalaz验证特性来验证HTTP参数。常见的情况是,仅在所有有效值都有效的情况下,获取少量已验证值并执行必要的操作,否则返回错误列表: (pavam1Val.liftFailNel |@| param2Val.liftFailNel |@| param3Val.liftFailNel) { getSomeResponse(_, _, _) } 这很好,直到我们必须使用8个以上的参数,因为|@运算符构造ApplicationBuilder,它仅限于8个参数。是否有另

我们在项目中使用scalaz验证特性来验证HTTP参数。常见的情况是,仅在所有有效值都有效的情况下,获取少量已验证值并执行必要的操作,否则返回错误列表:

(pavam1Val.liftFailNel |@|
 param2Val.liftFailNel |@|
 param3Val.liftFailNel) {
    getSomeResponse(_, _, _)
}

这很好,直到我们必须使用8个以上的参数,因为|@运算符构造ApplicationBuilder,它仅限于8个参数。是否有另一种方法可以一次性执行这种验证,最好是保持代码可读性

您想使用
方法,同时调用
映射(或
如果您愿意)。您可以无限期地继续使用

scala> val param1Val = success[String, Int](7)                              
param1Val: scalaz.Validation[String,Int] = Success(7)

scala> val param2Val = failure[String, Int]("abc")                          
param2Val: scalaz.Validation[String,Int] = Failure(abc)

scala> val param3Val = success[String, Int](9)                              
param3Val: scalaz.Validation[String,Int] = Success(9)

scala> val r = param1Val <*> (param2Val <*> (param3Val map getSomeResponse))
r: scalaz.Validation[String,Int] = Failure(abc)
scala>val param1Val=success[String,Int](7)
param1Val:scalaz.Validation[String,Int]=Success(7)
scala>val param2Val=failure[String,Int](“abc”)
param2Val:scalaz.Validation[String,Int]=失败(abc)
scala>val param3Val=success[String,Int](9)
param3Val:scalaz.Validation[String,Int]=Success(9)
scala>val r=param1Val(param2Val(param3Val映射getSomeResponse))
r:scalaz.Validation[String,Int]=失败(abc)

还有两种方法:

  • 将相关函数提升到
    验证
    上下文,然后将其应用于值

    getSomeResponse.lift[({ type L[X] = Validation[Y, X] })#L] apply (
      param1Val, param2Val, param3Val
    )
    
  • 使用单子理解

    for {
      x1 <- param1Val
      x2 <- param2Val
      x3 <- param3Val
    } yield getSomeResponse(x1, x2, x3)
    
    用于{
    
    x1不要忘记,
    getSomeResponse
    需要是一个curried函数,即
    Int=>Int=>Int=>Int
    。我们不是有相反的参数顺序吗?我的意思是得到与问题相同的结果,我们需要编写
    param3Val(param2Val(param1Val映射getSomeResponse))
    。我们已经更新了(任意)在下一个版本中将
    ApplicationBuilder
    限制为12。当然,一元版本不会累积错误,只会在第一个版本上跳出。在这里,提升将使用函子实例,因此它也会跳出。ron,不。在arity 1上提升函数使用函子实例。在arity较大的函数上提升使用Applicative-ins是的,所以它不会摆脱困境。