
A data type like Either but with an accumulating Applicative instance.
Validation
The Validation data type is isomorphic to Either, but has an instance
of Applicative that accumulates on the error side. That is to say, if two
(or more) errors are encountered, they are appended using a Semigroup
operation.
As a consequence of this Applicative instance, there is no corresponding
Bind or Monad instance. Validation is an example of, "An applicative
functor that is not a monad."
The library provides:
Classy optics (GetValidation, HasValidation, ReviewValidation,
AsValidation) following the conventions of makeClassy and
makeClassyPrisms from lens.
Polymorphic prisms (__Failure, __Success) for type-changing operations.
Isomorphisms to Either and (Bool, a).
ValidationMonadT
ValidationMonadT err m a is a monad transformer wrapping m (Validation err a).
Unlike Validation, it has short-circuiting Applicative, Bind, Monad,
and MonadError instances.
Validators
Four validator newtypes wrap a validation function with different type
parameter orders, enabling different class instances:
Validator x err a — Bifunctor, accumulating Applicative
ValidatorProfunctor err x a — Profunctor, accumulating Applicative
ValidatorMonadT x err f a — Monad, MonadTrans, BindTrans
ValidatorMonadProfunctorT err f x a — Profunctor, Monad, Category, Arrow
All four are isomorphic and have cross-type optics instances.