[英]Scalaz validation and ApplicativeBuilder limits
我們在項目中使用scalaz驗證特性來驗證HTTP參數。 常見的情況是,只有在所有值都有效的情況下,只需要很少的驗證值並執行必要的操作,否則返回錯誤列表:
(pavam1Val.liftFailNel |@|
param2Val.liftFailNel |@|
param3Val.liftFailNel) {
getSomeResponse(_, _, _)
}
這很好用,直到我們必須使用8個以上的參數,因為| @ | operator構造ApplicativeBuilder,限制為8個參數。 是否有其他方法可以執行此類一次性驗證,最好是保持代碼可讀?
你想使用<*>
方法,以及一次調用map
(如果你願意,可以使用∘
)。 您可以無限期地繼續使用<*>
。
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)
還有幾種方法可以做到:
將相關函數提升到Validation
上下文,然后將其應用於值。
getSomeResponse.lift[({ type L[X] = Validation[Y, X] })#L] apply ( param1Val, param2Val, param3Val )
使用monad理解。
for { x1 <- param1Val x2 <- param2Val x3 <- param3Val } yield getSomeResponse(x1, x2, x3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.