Haskell 多次重复一元计算并打印结果?(莫纳德兰多姆)
现在我正在使用MonadRandom图书馆。我有一个计算:Haskell 多次重复一元计算并打印结果?(莫纳德兰多姆),haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,现在我正在使用MonadRandom图书馆。我有一个计算: metroChain :: (RandomGen g) => Rand g Double 我想执行多次,然后按顺序打印结果。 或者更确切地说,我想创建一些多重计算的列表 要做一次,我会使用 main = do result <- evalRandIO metroChain print result 然而,我很难打印出任意数量的metroChain结果 每个结果都应该使用最后一个结果末尾给出的RandomGen…这
metroChain :: (RandomGen g) => Rand g Double
我想执行多次,然后按顺序打印结果。
或者更确切地说,我想创建一些多重计算的列表
要做一次,我会使用
main = do
result <- evalRandIO metroChain
print result
然而,我很难打印出任意数量的metroChain
结果
每个结果都应该使用最后一个结果末尾给出的RandomGen…这就是MonadRandom应该如何工作的,对吗
我研究了replicitem
,fmap
,还研究了一些变压器(尽管我承认我对它们的理解不够,无法掌握它们在我的问题中的应用)
有人能帮我实现我想要的功能吗?我觉得我错过了一些非常简单的事情。但是我对Haskell还很陌生。我要做一个飞跃,假设
metroStep
是一个MCMC Metropolis Hastings迭代
您的问题是希望MH步骤是马尔可夫的,但仅仅共享RandomGen
状态(这正是replicateM n metroStep
所做的)是不够的。这使得每一步都能够基于独立的随机变量。相比之下,如果RandomGen
状态没有共享,那么不变性将保证每个metroStep
都是相同的
所以你真正需要的是一种既有RandomGen
状态的东西,以便提供一个伪随机数链来生成自变量样本,又有一个固定状态,以便在每一步你都能得到p(x_i |θ,x_(i-1))
。我们构建一个transformer堆栈来实现这一点——我将使用mtl
库和random fu
,因为我几天前刚刚使用这些库编写了一个MCMC
metroStep :: (MonadRandom m, MonadState StateSpace m) => m StateSpace
其中,StateSpace
是状态空间中的一个点,包括两个观察到的变量和一个未观察到的变量,它是似然函数右侧的每个参数。现在,replicitem n metroStep::(MonadRandom,MonadState StateSpace m)=>m[StateSpace]
是马尔可夫序列StateSpace
点的列表
然后我们像这样“运行”这个monad堆栈的一个具体版本
do steps <- (`runRVar` StdRandom) . (`evalStateT` ss0) $ (replicateM n metroStep)
mapM_ print steps
do stepsreplicItem
是构建随机计算所需的。(除非tel的猜测是正确的。)
foo::Int->IO()
foo n=do
结果您是否尝试过replicateM\uuuu
?注意(\result->print result)
是一种复杂的说法print
metroStep
实际上名称不正确,它是metropolis算法的n次迭代。在我的实际代码中,它是metroChain n
。我已经有了一种从许多单独的步骤制作metroChain的方法?我应该使用mtl/statespace切换到completley吗?这是我当前的“完整”代码——我应该重构它吗?您的metroChain基本上是复制项应用于状态monad,丢弃结果。不过,你可以在上面使用print、mapM和replicItem的组合来获得结果。谢谢你的帮助:)我通过mtl
对要点进行了重构,添加了一条注释。这正是我想要的:)
do steps <- (`runRVar` StdRandom) . (`evalStateT` ss0) $ (replicateM n metroStep)
mapM_ print steps
foo :: Int -> IO ()
foo n = do
results <- evalRandIO (replicateM n metroStep)
mapM_ print results