Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 多次重复一元计算并打印结果?(莫纳德兰多姆)_Haskell_Monads_Monad Transformers - Fatal编程技术网

Haskell 多次重复一元计算并打印结果?(莫纳德兰多姆)

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…这

现在我正在使用MonadRandom图书馆。我有一个计算:

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 steps
replicItem
是构建随机计算所需的。(除非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