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

Коты недавно удалили класс Xor из библиотеки lib, возможно, вам стоит попробовать другую версию или пересмотреть свои зависимости – 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.

 Смежные вопросы

  • Нет связанных вопросов^_^