Define sized random generators for Data.Data generic types.
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Test.QuickCheck
import Boltzmann.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.
Works with QuickCheck and MonadRandom, but also similar user-defined monads
for randomness (just implement MonadRandomLike).
Can be tweaked somewhat with user defined generators.
Boltzmann.Species
An experimental interface to obtain Boltzmann samplers from an applicative
specification of a combinatorial system.