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