10

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

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

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

4

2 回答 2

11
于 2011-04-22T21:54:06.420 回答
2

还有几种方法可以做到:

  1. 将相关函数提升到Validation上下文,然后将其应用于值。

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

    for {
      x1 <- param1Val
      x2 <- param2Val
      x3 <- param3Val
    } yield getSomeResponse(x1, x2, x3)
    
于 2012-02-12T17:16:43.863 回答