给定以下分别用于 evalPair
、parPair
和 deepSeq
的函数,
evalPair :: Strategy a -> Strategy b -> Strategy (a,b)
evalPair sa sb (a,b) = do
a' <- sa a
b' <- sb b
return (a',b')
parPair :: Strategy a -> Strategy b -> Strategy (a,b)
parPair sa sb = evalPair (rparWith sa) (rparWith sb)
rdeepseq :: NFData a => Strategy a
rdeepseq x = rseq (force x)
问题是为什么下面的代码会像作者声称的那样并行计算?
parPair rdeepseq rdeepseq :: (NFData a, NFData b) => Strategy (a,b)
自从西蒙·马洛说了以下内容后,我就感到怀疑
To break down what happens when this
Strategy
is applied to a pair:parPair
callsevalPair
, andevalPair
callsrparWith rdeepseq
on each component of the pair. So the effect is that each component will be fully evaluated to normal form in parallel.
根据我所看到的 rparWith rdeepseq
是非正式的 rpar 。 rseq。 force
意味着参数将被评估为正常形式,它将按顺序使用 rseq 进行评估,因此最终 rpar 没有用处在并行上下文中。
所有内容均取自西蒙·马洛的书。
提前致谢。
最佳答案
让我们看一下parPair rdeepseq rdeepseq
:
parPair rdeepseq rdeepseq (a,b)
= evalPair (rparWith rdeepseq) (rparWith rdeepseq) (a,b)
= do
a' <- rparWith rdeepseq a
b' <- rparWith rdeepseq b
return (a', b')
由于 rparWith
引发它的参数,rdeepseq a
将并行评估(可能)。如果您要使用它就不会并行
evalPair rdeepseq rdeepseq
相反。 rparWith
至关重要,因为它引发了使用给定策略进行评估的争论。
关于haskell - 为什么以下内容会并行运行而不是顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41854791/