2017-02-09 40 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

相关问题