如何在 ST monad 中采样随机值?

How to sample random values in an ST monad?

如果我在 RVar monad

中有一个随机值生成器
ranfu :: RVar Bool

和一个在(例如)ST monad

中进行某种遍历的高阶函数
stTrav :: PrimMonad m => (Int -> m b) -> m [b]

那我怎么在这个遍历的循环中使用ranfu呢?我需要通过 STRef 来引导 RVar 的状态,还是有更好的方法?

最简单的方法可能是在 Data.Random.Source.MWC 中为 ST 使用 RandomSource 实例:

import Data.Random.Source.MWC

sample :: [Bool]
sample = runST $ do
  g <- create
  stTrav (\i -> runRVar ranfu g)