BSD-3-Clause licensed by Andrew Martin, chessai
Maintained by [email protected]
This version can be pinned in stack with:quickcheck-classes-,6766

Module documentation for


This library provides sets of properties that should hold for common typeclasses, along with three (3) simple functions that you can use to test them.


A convenience function for testing properties in GHCi. For example, at GHCi:

>>> lawsCheck (monoidLaws (Proxy :: Proxy Ordering))
Monoid: Associative +++ OK, passed 100 tests.
Monoid: Left Identity +++ OK, passed 100 tests.
Monoid: Right Identity +++ OK, passed 100 tests.

Assuming that the Arbitrary instance for Ordering is good, we now have confidence that the Monoid instance for Ordering satisfies the monoid laws.


A convenience function for checking multiple typeclass instances of multiple types. Consider the following Haskell source file:

import Data.Proxy (Proxy(..))
import Data.Map (Map)
import Data.Set (Set)

-- A 'Proxy' for 'Set' 'Int'. 
setInt :: Proxy (Set Int)
setInt = Proxy

-- A 'Proxy' for 'Map' 'Int' 'Int'.
mapInt :: Proxy (Map Int Int)
mapInt = Proxy

myLaws :: Proxy a -> [Laws]
myLaws p = [eqLaws p, monoidLaws p]

namedTests :: [(String, [Laws])]
namedTests =
  [ ("Set Int", myLaws setInt)
  , ("Map Int Int", myLaws mapInt)

Now, in GHCi:

>>> lawsCheckMany namedTests

Testing properties for common typeclasses
-- Set Int --

Eq: Transitive +++ OK, passed 100 tests.
Eq: Symmetric +++ OK, passed 100 tests.
Eq: Reflexive +++ OK, passed 100 tests.
Monoid: Associative +++ OK, passed 100 tests.
Monoid: Left Identity +++ OK, passed 100 tests.
Monoid: Right Identity +++ OK, passed 100 tests.
Monoid: Concatenation +++ OK, passed 100 tests.

-- Map Int Int --

Eq: Transitive +++ OK, passed 100 tests.
Eq: Symmetric +++ OK, passed 100 tests.
Eq: Reflexive +++ OK, passed 100 tests.
Monoid: Associative +++ OK, passed 100 tests.
Monoid: Left Identity +++ OK, passed 100 tests.
Monoid: Right Identity +++ OK, passed 100 tests.
Monoid: Concatenation +++ OK, passed 100 tests.


A convenience function that allows one to check many typeclass instances of the same type.

For example, in GHCi:

>>> lawsCheckOne (Proxy :: Proxy Word) [jsonLaws, showReadLaws]
ToJSON/FromJSON: Encoding Equals Value +++ OK, passed 100 tests.
ToJSON/FromJSON: Partial Isomorphism +++ OK, passed 100 tests.
Show/Read: Partial Isomorphism +++ OK, passed 100 tests.



All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to the Haskell Package Versioning Policy.

[] - 2019-01-12


  • genericLaws and generic1Laws were not exported. Now they are.


  • Add muvectorLaws.

[] - 2018-12-24


  • Support QuickCheck 2.7 and 2.8. This adds Arbitrary orphan instances to the test suite.
  • Fix CPP that caused build failures on GHC 7.10 and some old package versions.
  • Fix compiling the test suite without semigroupoids and compiling with old versions of transformers.
  • Add lower bound for semigroups to make sure the stimes method is available.
  • The laws commutativeSemigroupLaws and commutativeMonoidLaws no longer check any property other than commutativity. They must now be used in conjunction with, rather than in place of, semigroupLaws and monoidLaws. This is a breaking change.
  • Fix the right distribution law for semirings.
  • The function lawsCheckMany now terminates with exit code 1 if a test fails.
  • Extend showReadLaws with new properties for showsPrec, readsPrec, showList and readList.
  • Prettify JSON partial isomorphism test failure.


  • Add genericLaws and generic1Laws
  • Add property tests for special classes of semigroups. This includes: commutative, idempotent, rectangular band, and exponential.
  • bifoldableLaws, bifoldableFunctorLaws
  • Add showLaws.

[] - 2018-09-25


  • When compiling with GHC 8.6 and newer, use QuantifiedConstraints instead of Eq1, Show1, Arbitrary1, Eq2, Show, and Arbitrary2.

[] - 2018-09-21


  • Fix a CPP conditional import problem that caused build failures on GHC 7.10
  • Set an explicit lower bound for containers

[] - 2018-09-12


  • Support QuickCheck-2.12
  • Fix compilation for containers<0.5.9
  • Fix compilation with QuickCheck-2.9

[] - 2018-07-24


  • Build correctly when dependency on semigroupoids is disabled.

[0.4.14] - 2018-07-23


  • commutativeSemigroupLaws
  • the following typeclasses: Data.Semigroupoid.Semigroupoid (semigroupoids) Data.Functor.Plus.Plus (semigroupoids)


  • semiringLaws were never exported, we now export them.
  • make documentation for MonadPlus and Alternative consistent.
  • bump semirings to
  • deprecate Test.QuickCheck.Classes.specialisedLawsCheckMany in favour of Test.QuickCheck.Classes.lawsCheckOne

[0.4.13] - 2018-07-18


  • Laws for Enum typeclass.
  • Laws for Category typeclass.

[0.4.12] - 2018-06-07


  • Remaining laws for Storable typeclass.
  • Laws for Prim typeclass requiring setByteArray and setOffAddr to match the behavior that would result from manually iterating over the array and writing the value element-by-element.


  • Correct the law from the Bits typeclass that relates clearBit and zeroBits.
  • Limit the size of the lists that are used when testing that mconcat and sconcat have behaviors that match their default implementations. For some data structures, concatenating the elements in a list of several dozen arbitrary values does not finish in a reasonable amount of time. So, the size of these has been limited to 6.
  • Make library build against primitive-

[] - 2018-05-25


  • Fix compatibility with older GHCs when semigroupoids support is disabled.

[0.4.11] - 2018-05-24


  • Greatly improved documentation
  • specialisedLawsCheckMany function, a shorter way for the user to use lawsCheckMany on a single type.


  • Some internal names, making it more clear what it is that they do.

[0.4.10] - 2018-05-03


  • Property tests for mconcat, sconcat, and stimes. It isn’t common to override the defaults for these, but when you do, it’s nice to check that they agree with what they are supposed to do.

[0.4.9] - 2018-04-06


  • Be more careful with import of Data.Primitive. There is a branch of primitive that adds PrimArray. The implementation of PrimArray in this library should eventually be removed, but for now it will be sufficient to ensure that it does not create a conflicting import problem with the one in the branch.

[0.4.8] - 2018-03-29


  • Fix compilation regression for older versions of transformers.

[0.4.7] - 2018-03-29


  • Split up monolithic module into hidden internal modules.
  • Fix compilation regression for older GHCs.

[0.4.6] - 2018-03-29


  • Property test the naturality law for MonadZip. There is another law that instances should satisfy (the Information Preservation law), but it’s more difficult to write a test for. It has been omitted for now.
  • Property tests for all MonadPlus laws.
  • Several additional property tests for list-like containers: mapMaybe, replicate, filter.

[0.4.5] - 2018-03-26


  • Property tests for list-like containers that have IsList instances. These are useful for things that are nearly Foldable or nearly Traversable but are either constrained in their element type or totally monomorphic in it.

[0.4.4] - 2018-03-23


  • Cabal flags for controlling whether or not aeson and semigroupoids are used. These are mostly provided to accelerate builds primitive’s test suite.

[0.4.3] - 2018-03-23


  • Property tests for foldl1 and foldr1.
  • Property tests for Traversable.

[0.4.2] - 2018-03-22


  • Made compatible with transformers-0.3. Tests for higher-kinded typeclasses are unavailable when built with a sufficiently old version of both transformers and base. This is because Eq1 and Show1 are unavailable in this situation.

[0.4.1] - 2018-03-21


  • Made compatible with transformers-0.4.

[0.4.0] - 2018-03-20


  • Property tests for Bifunctor and Alternative.


  • Made compatible with older GHCs all the way back to 7.8.4.
  • Lower dependency footprint. Eliminate the dependency on prim-array and inline the relevant functions and types from it into Test.QuickCheck.Classes. None of these are exported.