В SO дается объяснение, почему проверка, как в скалязе, кошки (Scala) или Arrow (Kotlin) не могут быть монадой.
Насколько я понимаю, это потому, что они смоделировали монады в терминах аппликативных функторов, и желаемое поведение валидации как аппликативного (сбор всех недействительных) отличается от желаемого поведения валидации как монады (проверки последовательности и быстрая ошибка на первый недействительный). В результате вам нужно преобразовать проверку в либо (что является монадой), если вы хотите, чтобы сбой был быстрым.
На https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ, они упоминают причину, по которой проверка не является монадой, потому что следующее свойство не будет выполняться:
x <|*|> y === x >>= (a => y map ((a, _)))
Но если посмотреть на определение монады, указанное выше свойство не является частью законов монад. Итак, является ли это результатом того, что монады реализованы в терминах аппликативов, или указанное выше свойство является предпосылкой для того, чтобы быть монадой?
Все эти рассуждения более высокого порядка для меня совершенно в новинку, но в моем ограниченном понимании FP я мог бы иметь тип данных проверки, который имеет один тип поведения при использовании в качестве аппликативного (накопление инвалидов) и другое поведение при использовании в качестве монады ( быстро терпит неудачу).