我正在编写一些代码(Metropolis-Hastings MCMC采样器),它将使用随机数生成器,并基于此修改数组和其他可能的结构.
我最初的想法是使用ST monad,这样我就可以使用ST数组和mersenne-random-pure64包,保持PureMT生成器成为状态的一部分.
但是我希望能够将一些工作拆分成单独的辅助函数(例如,在给定范围内对随机整数进行采样,更新数组结构,以及可能更复杂的事情).要做到这一点,我想我需要将对PureMT gen和数组的引用传递给所有函数,如果我需要存储更多状态,这很快就会变得非常难看.
我的直觉是将所有状态组合成一个我可以在任何地方访问的单一数据类型,因为我会通过定义一个新的数据类型来使用State monad,但我不知道这对ST monad是否可行,或者正确的方式去做.
做这种事情有什么好的模式吗?我希望尽可能保持一般性,因为我可能需要添加额外的状态并在现有部分周围构建更多的monadic代码.
我试过寻找ST monad代码的例子,但它似乎没有被Real World Haskell所涵盖,并且haskell wiki示例非常简短.
谢谢!