这是关于并行策略和parMap
(Control.Parallel.Strategies)的疑问。
它涉及到parMap rseq
与parMap rpar
的等价性。
由于parMap
使用parList
,因此使用rseq
或rpar
都会并行地评估到WHNF。不是吗?
更新:
由于
parMap strat f = (`using` parList strat) . map f
parList = parTraversable
parTraversable strat = evalTraversable (rpar `dot` strat)
evalTraversable = traverse
strat2 `dot` strat1 = strat2 . runEval . strat1
parMap rseq
使用该策略
rpar `dot` rseq
这将会给出:
rpar . runEval . rseq
这将会给出:
(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x)
很难想到结果。
更新:
我明白了,惰性求值先取组合函数的第一个函数,然后
(\x -> x `par` return x)
该容器中的每个元素将在可能时被激发进行并行计算。
因此,我们可以添加 (rpar dot
rseq) 等同于 (rseq dot
rpar),是吗?
parMap rpar
是多余的,因为它为每个可遍历元素生成两个 sparks。