Предположим, мне нужно проверить параметры запроса. Результатом проверки является либо Success
, либо Failure
с NonEmptyList[String]
. Я, вероятно, могу использовать ValidationNel[String, Unit]
, но, похоже, немного переборщил. Думаю, мне нужна простая абстракция (см. Ниже).Как реализовать простую проверку в Scala
trait ValidationResult
object Success extends ValidationResult
class Failure(errors: NonEmptyList[String]) extends ValidationResult
и бинарная операция andAlso
объединить два результата:
trait ValidationResult {
def andAlso(other: ValidationResult): ValidationResult =
(this, other) match {
case (Success, Success) => Success
case (Success, failure @ Failure(_)) => failure
case (failure @ Failure(_), Success) => failure
case (Failure(errors1), Failure(errors2)) => Failure(errors1 + errors2)
}
}
Теперь, если я проверить три параметра с функциями checkA
, checkB
и checkC
я могу легко сочинять их следующим образом:
def checkA(a: A): ValidationResult = ...
def checkB(b: B): ValidationResult = ...
def checkC(c: C): ValidationResult = ...
def checkABC(a: A, b: B, c: C) = checkA(a) andAlso checkB(b) andAlso checkC(c)
Имеет ли смысл?
Имеет ли эта абстракция имя? Может быть, Monoid
?
Является ли он реализован в scalaz
или любой другой библиотеке scala?
Спасибо. Я попытаюсь продолжить работу с моноидом, потому что мне нужно это только для проверки вывода в моих тестах сейчас. – Michael