Proposal: Generalize the RandomGen and Random classes

Henning Thielemann lemming at
Sun Oct 10 11:33:57 EDT 2010

On Sun, 10 Oct 2010, Thomas DuBuisson wrote:

>> Couldn't we just have
>>>   class RandomGen g where
>>>     next :: g -> (Bool, g)
>> where the generator can be internally based on Word32, Word64 or
>> whatever is appropriate? Then the Random methods compose the bits to
>> Ints, Integers, Word16, Float etc. but some optimizer rules take care of
>> that the bit representation is actually not needed in common cases?
> I think you're dreaming of an imaginary optimizer of supreme power.  I
> don't see how RULES can ever get me from "next :: g -> (Bool, g)" to
> an efficient "nonce :: g -> (ByteString, g)".  Obviously I would be
> thrilled to be proven wrong.

   next :: RandomGen g => g -> (Bool, g)
  it is straightforward to generically implement
   nextWord8 :: RandomGen g => g -> (Word8, g)
   nextWord16 :: RandomGen g => g -> (Word16, g)

Now, say I want to program a RandomGen that is based on Word16. I 
   myNextWord16 :: MyGen -> (Word16, MyGen)
  and on top of it - so to say as fall-back - I implement
   myNextBit :: MyGen -> (Bool, MyGen)
  Now a rule
   {-# RULES nextWord16 = myNextWord16 #-}
  prevents us from actually going the long way from myNextWord16 to 
myNextBit to 'next' and back to 'nextWord16'.

I don't know, how Random ByteString is implemented, but if it is 
implemented efficiently in terms of a Word8 generator, it could also be 
implemented quite efficiently on MyGen.

However, a problem is, that MyGen must handle interleaved calls of Bit 
access (nextBit) and Word16 access (nextWord16). Thus it must maintain a 
bit counter that says which portions of the current Word16 have already 
been shipped and it must contain bit shuffling code. Hm, not optimal, I 

More information about the Libraries mailing list