【发布时间】:2017-01-25 23:41:46
【问题描述】:
分别给定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 是否在并行上下文中使用。
一切都取自西蒙·马洛的书中。
提前致谢。
【问题讨论】:
标签: haskell parallel-processing