Description
Laws for mtl classes as QuickCheck properties.
Description
See README
README.md
Testable monad and mtl laws
A library for testing implementations of mtl classes.
test-monad-laws defines laws for monadic effects as QuickCheck properties.
To use this library, quickcheck-higherorder is also needed.
Supported classes:
mtl:MonadExcept,MonadReader,MonadState,MonadWritertransformers:MonadTranstransformers-base:MonadBasemonad-control:MonadTransControl,MonadBaseControl
This project also tests the effectiveness of these laws, by including some incorrect implementations, called mutants, and some invalid laws.
Organization
For every mtl class, for example MonadReader:
- The most important module is
Test.Monad.Reader, defining laws for the class. Note that these laws are not official. But if your instance does not satisfy them, now you know. - Mutants and bad laws are in
Test.Monad.Reader.Mutants. - For convenience, all the good laws are gathered in a single list in
Test.Monad.Reader.Checkers. It can easily be consumed by the library tasty-quickcheck.
Related links and references
Papers with some relevant laws:
- Just
doit: Simple Monadic Equational Reasoning. Jeremy Gibbons, Ralf Hinze. - Proof abstraction for imperative languages. William L. Harrison.
Hackage search terms: laws, properties.