generic-random
Generic random generators for QuickCheck
http://github.com/lysxia/generic-random
| LTS Haskell 24.18: | 1.5.0.1 | 
| Stackage Nightly 2025-11-04: | 1.5.0.1 | 
| Latest on Hackage: | 1.5.0.1 | 
generic-random-1.5.0.1@sha256:70310b64747fa6cdbc53087c4cc3c3eba9614f4a4fba5d4651a67dea103d19e8,2618Module documentation for 1.5.0.1
- Generic
 
Generic random generators 
 
Generic random generators
to implement Arbitrary instances for QuickCheck
Automating the arbitrary boilerplate also ensures that when a type changes to
have more or fewer constructors, then the generator either fixes itself to
generate that new case (when using the uniform distribution) or causes a
compilation error so you remember to fix it (when using an explicit
distribution).
This package also offers a simple (optional) strategy to ensure termination for
recursive types:
make Test.QuickCheck.Gen’s size parameter decrease at every recursive call;
when it reaches zero, sample directly from a trivially terminating generator
given explicitly (genericArbitraryRec and withBaseCase) or implicitly
(genericArbitrary').
Example
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic)
import Test.QuickCheck
import Generic.Random
data Tree a = Leaf | Node (Tree a) a (Tree a)
  deriving (Show, Generic)
instance Arbitrary a => Arbitrary (Tree a) where
  arbitrary = genericArbitraryRec uniform `withBaseCase` return Leaf
-- Equivalent to
-- > arbitrary =
-- >   sized $ \n ->
-- >     if n == 0 then
-- >       return Leaf
-- >     else
-- >       oneof
-- >         [ return Leaf
-- >         , resize (n `div` 3) $
-- >             Node <$> arbitrary <*> arbitrary <*> arbitrary
-- >         ]
main :: IO ()
main = sample (arbitrary :: Gen (Tree ()))
Related
- 
The following two packages also derive random generators, but only with a uniform distribution of constructors:
- quickcheck-arbitrary-template (TH)
 - generic-arbitrary (GHC Generics)
 
 - 
testing-feat: derive enumerations for algebraic data types, which can be turned into random generators (TH).
 - 
boltzmann-samplers: derive Boltzmann samplers (SYB).
 
Changes
Changelog
Latest version: https://github.com/Lysxia/generic-random/blob/master/changelog.md
1.5.1.0
- Support GHC 9.2
 
1.5.0.0
- Add newtypes for 
DerivingVia(thanks, blackheaven) - Drop compatibility with GHC 8.0 and 8.2
 
1.4.0.0
- Add option to use only coherent instances
 - Export 
SetSizedandSetUnsized - Drop compatibility with GHC 7
 
1.3.0.1
- Fix small typos in documentation.
 
1.3.0.0
- Add 
ConstrGen(custom generators for fields specified by constructor name and index). - Stop requiring custom generators lists to be terminated by 
:+ (), or to be lists at all. - Breaking minor change: when a record field has a different type than
a 
FieldGencustom generator for the same field name, this is now a compilation error. This was simply ignored before. - Miscellaneous documentation improvements in 
Generic.Randommodule. 
1.2.0.0
- 
Fix a bug where generators did not decrease the size parameter with single-field constructors
 - 
The sized generators now use a custom generator for lists. Use
genericArbitraryRecG ()to disable that. See tutorial for more information. - 
Lists of custom generators are now constructed using
(:+)instead ofGenList - 
Rename
FieldtoFieldGen - 
Add
Gen1,Gen1_(custom generators for unary type constructors) - 
Add
listOf',listOf1',vectorOf' - 
Remove deprecated module
Generic.Random.Generic 
1.1.0.2
- Improved performance
 
1.1.0.1
- Fix build for GHC<8
 
1.1.0.0
- Add option to specify custom generators for certain fields,
overriding Arbitrary instances
- Add 
genericArbitraryG,genericArbitraryUG,genericArbitrarySingleG,genericArbitraryRecG 
 - Add 
 - Add 
GArbitraryandGUniformWeightsynonyms - Deprecate 
Generic.Random.Generic - Remove 
weightsfrom the external API 
1.0.0.0
- Make the main module 
Generic.Random - Rework generic base case generation
- You can explicitly provide a trivial generator (e.g., returning a
nullary constructor) using 
withBaseCase - Generically derive 
BaseCaseSearchand letBaseCasefind small values, no depth parameter must be specified anymore 
 - You can explicitly provide a trivial generator (e.g., returning a
nullary constructor) using 
 - Add 
genericArbitrarySingle,genericArbitraryRec,genericArbitraryU' - Deprecate 
weights - Fixed bug with 
genericArbitrary'not dividing the size parameter 
0.5.0.0
- Turn off dependency on boltzmann-samplers by default
 - Add 
genericArbitraryU,genericArbitraryU0andgenericArbitraryU1 - Compatible with GHC 7.8.4 and GHC 7.10.3
 
0.4.1.0
- Move Boltzmann sampler modules to another package: boltzmann-samplers
 
0.4.0.0
- Check well-formedness of constructor distributions at compile time.
 - No longer support GHC 7.10.3 (the above feature relies on Generic information which does not exist before GHC 8)
 
0.3.0.0
- Support GHC 7.10.3
 - Replace 
TypeApplicationswith ad-hoc data types ingenericArbitraryFrequency'/genericArbitrary'