MIT licensed by Li-yao Xia
Maintained by [email protected]
This version can be pinned in stack with:generic-random-,2618
Depends on 2 packages(full list with versions):

Generic random generators Hackage Build Status

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').


{-# 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 ()))




Latest version:

  • Support GHC 9.2

  • Add newtypes for DerivingVia (thanks, blackheaven)
  • Drop compatibility with GHC 8.0 and 8.2

  • Add option to use only coherent instances
  • Export SetSized and SetUnsized
  • Drop compatibility with GHC 7

  • Fix small typos in documentation.

  • 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 FieldGen custom generator for the same field name, this is now a compilation error. This was simply ignored before.
  • Miscellaneous documentation improvements in Generic.Random module.

  • 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 of GenList

  • Rename Field to FieldGen

  • Add Gen1, Gen1_ (custom generators for unary type constructors)

  • Add listOf', listOf1', vectorOf'

  • Remove deprecated module Generic.Random.Generic

  • Improved performance

  • Fix build for GHC<8

  • Add option to specify custom generators for certain fields, overriding Arbitrary instances
    • Add genericArbitraryG, genericArbitraryUG, genericArbitrarySingleG, genericArbitraryRecG
  • Add GArbitrary and GUniformWeight synonyms
  • Deprecate Generic.Random.Generic
  • Remove weights from the external API

  • 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 BaseCaseSearch and let BaseCase find small values, no depth parameter must be specified anymore
  • Add genericArbitrarySingle, genericArbitraryRec, genericArbitraryU'
  • Deprecate weights
  • Fixed bug with genericArbitrary' not dividing the size parameter

  • Turn off dependency on boltzmann-samplers by default
  • Add genericArbitraryU, genericArbitraryU0 and genericArbitraryU1
  • Compatible with GHC 7.8.4 and GHC 7.10.3

  • Move Boltzmann sampler modules to another package: boltzmann-samplers

  • 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)

  • Support GHC 7.10.3
  • Replace TypeApplications with ad-hoc data types in genericArbitraryFrequency'/genericArbitrary'