
Benja Fallenstein wrote:
Hi Dominic,
myRandomR :: (Foo, Foo) -> MyGen -> (Foo, MyGen)
but you need
randomR :: RandomGen g => (Foo, Foo) -> g -> (Foo, g)
i.e., the function is required to be more generic than the one you provide.
Thank you - obvious in hindsight.
The good news is that you don't need to declare Foo at all. You only need to declare an instance of Random if you want to generate random *values* of some new type. If you just want numbers, remove all the stuff about Foo and call (for example)
randomR (0,5) $ MyGen 18
and it'll give you a number and a new MyGen.
But don't I need something in class Random so that I can use choose?
choose :: forall a. (Random a) => (a, a) -> Gen a
Actually, looking in QuickCheck, I can see this approach is not going to work as QuickCheck always picks the StdGen instance of RandomGen :-(
choose :: Random a => (a, a) -> Gen a choose bounds = (fst . randomR bounds) `fmap` rand
rand :: Gen StdGen rand = Gen (\n r -> r)
Does anyone have any ideas on a way to force QuickCheck to use a different generator of random values? Thanks, Dominic.