
I'm toying with generating random objects (for example tuples) and started wondering what pearls of wisdom Cafe might have on the matter. Two obvious points (relating to my toy code, shown below) are 1) The meaning of the limits required by randomR is not obvious for types such as tuples (you could come up with some definition, but it wouldn't be unique: how would you allow for different ones?[*]; you might decide that having such limits is nonsensical and not want to provide a randomR: would you then leave it undefinded?). [*] I guess this is related to issues such as Num being both a sum and and product monoid. 2) I'm sure there are at least half a dozen prettier definitions of random. But I suspect that the juicy bits will be in offerings about issues that I haven't even dreamed about. Presumably QuickCheck's test-data generation mechanism would be interesting to look at in this context. Is there a gentle explanation of how it works somewhere? Here's my initial effort: import Control.Monad import System.Random main :: IO (Int, Int) main = randomIO instance (Random a, Random b) => Random (a, b) where randomR = undefined random g0 = let (i1,g1) = random g0 (i2,g2) = random g1 in ((i1,i2), g1)