Lightweight pure data validation based on Applicative and Selective functors.
validation-selective is built around the following data type:
data Validation e a
= Failure e
| Success aThis data type is similar to Either but allows accumulating all
errors instead of short-circuiting on the first one.
For more examples and library tutorial, refer to Haddock:
validation-selective is not the only package that provides such
Validation data type. However, unlike other packages, it has some
noticeable advantages:
- Lightweight.
validation-selectivedepends only onbaseandselective(which is tiny) Haskell libraries which make this package fast to build. So adding validation capabilities to your library or application doesn't contribute much to your dependency footprint. - Selective instance.
validation-selectiveis the only package that providesSelectiveinstance forValidationwhich allows usingMonad-like branching behaviour but without implementing wrongMonadinstance. - More algebraic instances.
validation-selectivealso provides theAlternativeinstance and a more generalSemigroupinstance. - Best-in-class documentation. Official Haddock documentation
contains mini-tutorial, usage example, per-component comparison with
Either, the motivation behind each instance and the interface in general along with examples for each instance and function.
The below section provides per-package comparison with the most popular validation packages in the Haskell ecosystem:
either:Validationimplementation by Edward Kmett. This package is more heavyweight, since it depends on more Haskell libraries likeprofunctors,bifunctors,semigroupoids. But it also provides prisms forValidationand some combinators forEither.validation:Validationfrom Queensland Functional Programming Lab. Depends onlens, which makes it even heavier but also have richer interface compared to theeitherpackage.
validation-selective is compatible with the latest GHC compiler
versions starting from 8.6.
In order to start using validation-selective in your project, you
will need to set it up with the three easy steps:
-
Add the dependency on
validation-selectivein your project's.cabalfile. For this, you should modify thebuild-dependssection by adding the name of this library. After the adjustment, this section could look like this:build-depends: base ^>= 4.14 , validation-selective ^>= 0.0
-
In the module where you wish to implement pure data validation, you should add the import:
import Validation (Validation (..))
-
Now you can use the types and functions from the library:
main :: IO () main = print [Failure "wrong", Success 42]
If validation-selective is not available on your current Stackage
resolver yet, fear not! You can still use it from Hackage by adding
the following to the extra-deps section of your stack.yaml file:
extra-deps:
- validation-selective-CURRENT_VERSION