2017-02-09 15 views
0

我寫了這個代碼合併多個經過驗證的成單一個

def valid1() : Validated[List[String], Boolean] = {...} 
def valid2() : Validated[List[String], Boolean] = {...} 
def valid3() : Validated[List[String], Boolean] = {...} 
def valid4() : Validated[List[String], Boolean] = {...} 
val consolidated = valid1 |@| valid2 |@| valid3 |@| valid4 
consolidated.map{_ && _ && _ && _} match { 
    case Valid(true) => // do something 
    case Invalid(errorList) => // do something 
} 

不必在每個中間驗證做|@|並做了&&地圖......我可以寫一個簡單的方法裏面的?我想單獨試圖做|@|,然後&&使代碼看起來有點可怕。 (對不起,我現在不是絕地了)

+0

貓最近從lib中刪除Xor類,也許你應該嘗試另一個版本或重新檢查你的依賴 – dk14

+0

是的。我降級到0.7.2,並解決了這個問題。 –

回答

2

您可以使用sequence(或sequenceU)。

import cats.data.{NonEmptyList, Validated} 
import cats.implicits._ 
// import cats.syntax.reducible._ 
// import cats.syntax.traverse._ 

val valids = NonEmptyList.of(valid1, valid2, valid3, valid4) 

val consolidated: Validated[List[String], Boolean] = 
    valids.sequenceU.map(_.reduceLeft(_ && _)) 

Validated[List[String], Boolean]是那種奇怪的類型,因爲它可以代表兩個無效/假情況:Invalid(messagesList)Valid(false)。由於您只有模式匹配Valid(true)(而不是Valid(false)),所以這可能也可以建模爲Validated[List[String], Unit]

// import cats.syntax.foldable._ 

val consolidated2: Validated[List[String], Unit] = 
    valids.traverseU_(_.ensure("was false" :: Nil)(identity)) 

consolidated2.fold(
    errorList => // do something 
    , _ => // do something 
) 

對於編譯器錯誤:你可能有貓使用的是舊版本的另一個依賴。貓丟棄了Xor數據類型,轉而使用Either,使用version 0.8.0

相關問題