<p dir="ltr">Normally, a monad transformer to provide a random number generator would be of the form StateT g, where g is a RandomGen. But I've seen some libraries (like QuickCheck) define their RandomT as:</p>
<p dir="ltr">newtype RandomT g m a = RandomT { runRandomT :: g -> m a }</p>
<p dir="ltr">with their monadic bind operation defined as</p>
<p dir="ltr">(RandomT m) >>= f = RandomT $ \g -> let (ga, gb) = split g in m ga >>= (\a -> runRandomT (f a) gb)</p>
<p dir="ltr">and return and fail as in ReaderT.</p>
<p dir="ltr">Can someone describe the advantages and disadvantages of doing RandomT this way? I mean, if your generator has a subpar split operation (and most do), this will obviously exacerbate any problems with it. Does it give any comparable advantages?</p>