# 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*](https://hackage.haskell.org/package/quickcheck-higherorder) is also needed. Supported classes: - `mtl`: `MonadExcept`, `MonadReader`, `MonadState`, `MonadWriter` - `transformers`: `MonadTrans` - `transformers-base`: `MonadBase` - `monad-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 ---------------------------- - [validity](https://github.com/NorfairKing/validity) - [checkers](https://hackage.haskell.org/package/checkers) - [quickcheck-classes](http://hackage.haskell.org/package/quickcheck-classes) - [hedgehog-classes](https://hackage.haskell.org/package/hedgehog-classes) - [ClassLaws](https://hackage.haskell.org/package/ClassLaws) - [test-invariant](https://hackage.haskell.org/package/test-invariant-0.4.5.0/docs/Test-Invariant.html) Papers with some relevant laws: - Just `do` it: Simple Monadic Equational Reasoning. Jeremy Gibbons, Ralf Hinze. - Proof abstraction for imperative languages. William L. Harrison. Hackage search terms: [laws](https://hackage.haskell.org/packages/search?terms=laws), [properties](https://hackage.haskell.org/packages/search?terms=properties).