gpt4 book ai didi

haskell - Rand 的 MonadParallel 实例

转载 作者:行者123 更新时间:2023-12-02 15:40:42 25 4
gpt4 key购买 nike

我目前正在 ReaderT r (Rand StdGen) a 中进行计算,我希望并行运行。我遇到过Monad Parallel看起来它会做我想要的。

已经有一个用于 ReaderT 的 MonadParallel 实例,但我必须为 monad-random 中的 Rand 创建自己的实例。 。但是,我不确定我是否做对了。我不太熟悉 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

虽然我觉得有必要忽略这一点(数字仍然是随机的,对吧?)我也忍不住觉得我错过了一些东西。这样可以吗还是有更好的解决方案?

最佳答案

我主要担心的是,这违反了以下保证:

Apart from the possible ordering of side effects, this function is equivalent to \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

对比

let g = mkStdGen 0
r = evalRand (P.bindM2 (\x y -> return (x,y)) getRandom getRandom) g

这确实提出了关于 split 的有趣问题、伪随机数以及随机数在纯度方面的性质。我很难想象你的实例会产生不利影响的情况,但软件系统的复杂性一直让我感到惊讶。正因为如此,我不会违反对 bindM2 的期望,即使它是随机数。

关于haskell - Rand 的 MonadParallel 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14102146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com