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