Выравнивание вложенных проверок Scalaz

Я новичок в scalaz, и я начал с проверок.

У меня есть несколько функций проверки в форме:

def validateXyz(...): ValidationNEL[String, String] = ...

Затем я использую аппликативный стиль для объединения нескольких проверок, а затем вызываю другую функцию, которая также возвращает проверку:

(validateXyz(...) |@| validateAbc(...)) { (first, second) =>
   otherFunction(first, second)
}

где,

def otherFunction(first: String, second: String): ValidationNEL[String, String] = ...

Однако при вызове приведенный выше результирующий тип:

val result: ValidationNEL[String, ValidationNEL[String, String]] = ...

Я могу распаковать это, вызвав fold для результата с двумя функциями, первая, которая просто распространяет NEL как ошибку, а вторая просто распространяет свой аргумент:

def propagateF(result: NonEmptyList[String]): ValidationNEL[String, String] = result.fail
def propagateV(result: ValidationNEL[String, String]) = result

result.fold(propagateF, propagateV)
// result type: ValidationNEL[String, String]

Это работает и возвращает правильные типы и результаты. Однако это не похоже на правильное решение, поэтому я должен что-то упустить. Что мне нужно сделать, чтобы избежать этого ужасного фолда в конце?

10
задан Chris Turner 23 June 2012 в 22:54
поделиться