如何在 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)
如果我在 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)