簡體   English   中英

Scalaz驗證和ApplicativeBuilder限制

[英]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)

還有幾種方法可以做到:

  1. 將相關函數提升到Validation上下文,然后將其應用於值。

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

     for { x1 <- param1Val x2 <- param2Val x3 <- param3Val } yield getSomeResponse(x1, x2, x3) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM