Scalaz 验证和 ApplicativeBuilder 限制
我们在项目中使用 scalaz 验证特征来验证 HTTP 参数。常见情况是采用很少的经过验证的值,并且仅当所有值都有效时才执行必要的操作,否则返回错误列表:
(pavam1Val.liftFailNel |@|
param2Val.liftFailNel |@|
param3Val.liftFailNel) {
getSomeResponse(_, _, _)
}
这很有效,直到我们必须使用超过 8 个参数,因为 |@|运算符构造 ApplicativeBuilder,它限制为 8 个参数。是否有另一种方法来执行这种一次性验证,最好保持代码可读?
We're using scalaz validation trait in our project to validate HTTP parameters. The common case is taking few validated values and performing neccessary action only if all of them are valid, returning list of errors otherwise:
(pavam1Val.liftFailNel |@|
param2Val.liftFailNel |@|
param3Val.liftFailNel) {
getSomeResponse(_, _, _)
}
This works nice, until we have to use more than 8 parameters, because |@| operator constructs ApplicativeBuilder, which is limited to 8 arguments. Is there another way to perform such all-at-once validation, preferably keeping the code readable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您想要使用
<*>
方法,以及对map
的一次调用(如果您愿意,也可以使用∘
)。您可以无限期地继续使用<*>
。you want to use the
<*>
method, along with a single call tomap
(or∘
if you prefer). You can keep using<*>
indefinitely.还有几种方法可以实现此目的:
将相关函数提升到
验证
上下文,然后将其应用于值。使用 monad 理解。
<前><代码>对于{
x1 <- param1Val
x2 <- param2Val
x3 <- param3Val
} 产生 getSomeResponse(x1, x2, x3)
A couple more ways to do it:
Lift the relevant function to
Validation
context, and then apply it to the values.Use monad comprehension.