The generic-random package

[Tags:library, mit]

Please see the README.

[Skip to Readme]


Change log
Dependencies ad, base (==4.9.*), containers, hashable, hmatrix, ieee754, MonadRandom, mtl, QuickCheck, transformers, unordered-containers, vector [details]
License MIT
Author Li-yao Xia
Stability Experimental
Category Generics, Testing
Home page
Source repository head: git clone
Uploaded Sun Feb 5 19:44:11 UTC 2017 by lyxia
Distributions LTSHaskell:, NixOS:, Stackage:
Downloads 184 total (53 in the last 30 days)
1 []
Status Docs available [build log]
Last success reported on 2017-02-05 [all 1 reports]




testEnable testing. Disabled by default because the current test suite is slow and can fail with non-zero probability.DisabledManual

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

For package maintainers and hackage trustees

Readme for generic-random

Readme for generic-random-

Generic random generators Hackage Build Status


Define sized random generators for almost any type.

    {-# LANGUAGE DeriveDataTypeable #-}

    import Data.Data
    import Test.QuickCheck
    import Generic.Random.Data

    data Term = Lambda Int Term | App Term Term | Var Int
      deriving (Show, Data)

    instance Arbitrary Term where
      arbitrary = sized $ generatorPWith [positiveInts]

    positiveInts :: Alias Gen
    positiveInts =
      alias $ \() -> fmap getPositive arbitrary :: Gen Int

    main = sample (arbitrary :: Gen Term)
  • Objects of the same size (number of constructors) occur with the same probability (see Duchon et al., references below).
  • Implements rejection sampling and pointing.
  • Uses Data.Data generics.
  • Works with QuickCheck and MonadRandom, but also similar user-defined monads for randomness (just implement MonadRandomLike).
  • Can be tweaked somewhat with user defined generators.


Say goodbye to Constructor <$> arbitrary <*> arbitrary <*> arbitrary-boilerplate.

    {-# LANGUAGE DeriveGeneric #-}

    import GHC.Generics ( Generic )
    import Test.QuickCheck
    import Generic.Random.Generic

    data Tree a = Leaf | Node (Tree a) a (Tree a)
      deriving (Show, Generic)

    instance Arbitrary a => Arbitrary (Tree a) where
      arbitrary = genericArbitrary' Z uniform

    -- Equivalent to
    -- > arbitrary =
    -- >   sized $ \n ->
    -- >     if n == 0 then
    -- >       return Leaf
    -- >     else
    -- >       oneof
    -- >         [ return Leaf
    -- >         , Node <$> arbitrary <*> arbitrary <*> arbitrary
    -- >         ]

    main = sample (arbitrary :: Gen (Tree ()))
  • User-specified distribution of constructors, with compile-time checks.
  • A simple (optional) strategy to ensure termination: Test.QuickCheck.Gen's size parameter decreases at every recursive genericArbitrary' call; when it reaches zero, sample directly from a finite set of finite values.
  • Uses GHC.Generics generics.
  • Just for QuickCheck's arbitrary.
  • More flexible than Generic.Random.Data's Boltzmann samplers, which compute fixed weights for a given target size and concrete type, but with a less regular distribution.


An experimental interface to obtain Boltzmann samplers from an applicative specification of a combinatorial system.

No documentation (yet).


Papers about Boltzmann samplers, used in Generic.Random.Data: