[Haskell-cafe] Bug with QuickCheck 1.1 and GHC 6.8.2

Patrick Perry patperry at stanford.edu
Thu Aug 14 13:08:08 EDT 2008


'split' has type

split :: StdGen -> (StdGen, StdGen)

It takes a generator and produces two independent generators.  The old  
version of variant calls 'split' n times to get a new generator, and  
it only calls "split" on the second result.  The new version calls  
split (log n) times.  It gets a unique generator for each value of n  
by using both results from split.

For example,

rands 2 r0 = let (r1, r2) = split r0
		            (r3, r4) = split r1
		       in r4

rands 3 r0 = let (r1,r2) = split r0
	                    (r3',r4') = split r2
                        in r4'


Patrick

On Aug 14, 2008, at 4:57 AM, Johan Tibell wrote:

> On Thu, Aug 14, 2008 at 12:15 PM, Patrick Perry  
> <patperry at stanford.edu> wrote:
>> Actually, a much better solution is:
>>
>> variant :: Int -> Gen a -> Gen a
>> variant v (Gen m) = Gen (\n r -> m n (rands r v))
>> where
>> rands r0 0 = r0
>> rands r0 n = let (r1,r2) = split r0
>>                  (n',s)  = n `quotRem` 2
>>              in case s of
>>                   0 -> rands r1 n'
>>                   _ -> rands r2 n'
>
> It's not really clear to me how this works. Could you please explain?
>
> Cheers,
>
> Johan



More information about the Haskell-Cafe mailing list