
Hi Mauricio. What you want actually already exists in QuickCheck as the "Gen" monad.
newtype Gen a = Gen (Int -> StdGen -> a)
instance Monad Gen where return a = Gen (\n r -> a) Gen m >>= k = Gen (\n r0 -> let (r1,r2) = split r0 Gen m' = k (m n r1) in m' n r2)
(...)
Nice. I think that's exactly what I was trying to do.
You could also implement this as a variation on the State monad if you wanted to avoid using split: (...)
Yes. After Brent's explanation I finally realized State was the perfect option. Maybe it should also be better for QuickCheck. I just didn't know it… There are many things in the standard library that do nice things, but I don't understand them until I write a few hundred lines trying to do what they do :) Thanks for your support and patience, MaurĂcio