generic-random: Generic random generators

[ generics, library, mit, testing ] [ Propose Tags ]

For more information

[Skip to Readme]
Change log
Dependencies base (>=4.9 && <4.11), QuickCheck [details]
License MIT
Author Li-yao Xia
Revised Revision 1 made by lyxia at Mon Jan 1 16:46:46 UTC 2018
Category Generics, Testing
Home page
Source repo head: git clone
Uploaded by lyxia at Mon Jan 1 16:08:11 UTC 2018
Distributions LTSHaskell:, NixOS:, Stackage:
Downloads 3168 total (43 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-01-01 [all 1 reports]
Hackage Matrix CI




Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for generic-random-

[back to package description]

Generic random generators Hackage Build Status

Derive simple random generators for QuickCheck using generics.

Automating the Arbitrary boilerplate also ensures that if a type changes to have more constructors, then the generator fixes itself to generate that new case (with uniform distribution) or causes a compilation error (with an explicit distribution).

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 = sample (arbitrary :: Gen (Tree ()))