Из документации validation
пакета:Почему у AccValidation нет экземпляра Monad?
Тип данных
AccValidation
изоморфноEither
, но имеет экземплярApplicative
, который накапливается на стороне ошибки. То есть, если встречаются две (или более) ошибки, они добавляются с помощью операцииSemigroup
.В результате этого примера
Applicative
нет соответствующегоBind
илиMonad
экземпляра.AccValidation
- пример «Прикладного функтора, который не является монадой».
Непонятно мне, почему это является следствием. Я могу представить пример Monad
для AccValidation
, который ведет себя как Either
. Что сделало бы это незаконным?
Какой пример вы представляете? Обратите внимание, что аппликативный экземпляр для «Либо» накапливается на стороне без ошибок. – Alec
Невозможно запустить более поздние «этапы», если предыдущий этап завершился неудачно. С помощью Applicative вы все равно можете * вычислить * более поздние этапы, даже если вы не можете применить их для получения успешного результата (и, следовательно, вы можете узнать, не завершилось ли вычисление более поздних этапов). С Монадой каждый этап возвращает следующий, поэтому вы даже не знаете, какими должны быть последующие этапы. – immibis
@Alec Приложение для «Либо» не «накапливает» * вообще * в том же смысле, что «AccValidation» накапливается, правильно? –