Tom*_*age 7 random parallel-processing haskell
我目前正在处理ReaderT r (Rand StdGen) a我希望并行运行的计算.我遇到了Monad Parallel,看起来它会做我想要的.
已经存在MonadParallel的实例,ReaderT但是我必须Rand从monad-random创建自己的实例.但是,我不确定我做得对.我对Haskell中的并行编程并不太熟悉,但我相信有人期望在并行中运行计算应该给出与它们正常运行时相同的值.因为我的Rand的bindM2实例使用split(因此从同一个初始生成器获取一组不同的随机数),这不是我的实例的情况.
instance P.MonadParallel (Rand StdGen) where
bindM2 f ma mb = do
split1 <- getSplit
split2 <- getSplit
let a = evalRand ma split1
let b = evalRand mb split2
a `par` b `pseq` f a b
Run Code Online (Sandbox Code Playgroud)
虽然我觉得有一种情况可以忽略这一点(数字仍然是随机的,对吗?)我也不禁感到我错过了什么.这没关系还是有更好的解决方案?
我主要担心的是,这违反了以下保证:
除了副作用的可能顺序之外,此函数相当于
\f ma mb-> do {a <- ma; b <- mb; f a b}
这些都会产生不同的结果:
let g = mkStdGen 0
r = evalRand (do x <- getRandom
y <- getRandom
return (x, y)) g
Run Code Online (Sandbox Code Playgroud)
与
let g = mkStdGen 0
r = evalRand (P.bindM2 (\x y -> return (x,y)) getRandom getRandom) g
Run Code Online (Sandbox Code Playgroud)
这确实提出了关于split、伪随机数以及随机数在纯度方面的性质的有趣问题。我很难想象你的实例会产生不利影响的情况,但软件系统的复杂性一直让我感到惊讶。正因为如此,我不会违反对 的期望bindM2,即使它是随机数。