我经常看到
Haskell的并行策略的使用和解释与纯计算相关(例如fib).但是,我并不经常看到它与monadic结构一起使用:当应用于ST或IO时,是否对par和相关函数的效果有合理的解释?这样的使用会增加任何加速吗?
解决方法
IO monad中的并行性更准确地称为“并发”,并且由Control.Concurrent模块中的forkIO和朋友支持.
并行化ST monad的困难在于ST必然是单线程的 – 这就是它的目的. ST Monad有一个懒惰的变种,Control.Monad.ST.Lazy,它原则上可以支持并行评估,但我不知道有人试图这样做.
有一个新的monad用于并行评估,名为Eval,可以在parallel package的最新版本中找到.我建议使用带有rpar和rseq的Eval monad,而不是par和pseq,因为它会带来更强大和可读的代码.例如,可以编写通常的fib示例
fib n = if n < 2 then 1 else runEval $do x <- rpar (fib (n-1)) y <- rseq (fib (n-2)) return (x+y)