分别为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)
我很自从Simon Marlow说以下
要分解将
Strategy
应用于一对时发生的情况:parPair
调用evalPair
,并在每个evalPair
调用rparWith rdeepseq
这对组成部分。所以效果是每个组件都会 完全评估为正常形式。
根据我所看到的rparWith rdeepseq
是非正式的rpar . rseq . force
,这意味着参数将被评估为正常形式,它将依次用rseq
进行评估,因此最终rpar
在并行环境中没用。
一切都取自Simon Marlow的书。
提前致谢。
答案 0 :(得分:4)
让我们看看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
是必不可少的,因为它激发了用给定策略进行评估的论据。